/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.pretty;
import java.io.Serializable;
import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.spi.EntityEntry;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.Type;
MessageHelper methods for rendering log messages relating to managed
entities and collections typically used in log statements and exception
messages.
Author: Max Andersen, Gavin King
/**
* MessageHelper methods for rendering log messages relating to managed
* entities and collections typically used in log statements and exception
* messages.
*
* @author Max Andersen, Gavin King
*/
public final class MessageHelper {
private MessageHelper() {
}
// entities ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Generate an info message string relating to a particular entity,
based on the given entityName and id.
Params: - entityName – The defined entity name.
- id – The entity id value.
Returns: An info string, in the form [FooBar#1].
/**
* Generate an info message string relating to a particular entity,
* based on the given entityName and id.
*
* @param entityName The defined entity name.
* @param id The entity id value.
* @return An info string, in the form [FooBar#1].
*/
public static String infoString(String entityName, Serializable id) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if( entityName == null ) {
s.append( "<null entity name>" );
}
else {
s.append( entityName );
}
s.append( '#' );
if ( id == null ) {
s.append( "<null>" );
}
else {
s.append( id );
}
s.append( ']' );
return s.toString();
}
Generate an info message string relating to a particular entity.
Params: - persister – The persister for the entity
- id – The entity id value
- factory – The session factory - Could be null!
Returns: An info string, in the form [FooBar#1]
/**
* Generate an info message string relating to a particular entity.
*
* @param persister The persister for the entity
* @param id The entity id value
* @param factory The session factory - Could be null!
* @return An info string, in the form [FooBar#1]
*/
public static String infoString(
EntityPersister persister,
Object id,
SessionFactoryImplementor factory) {
StringBuilder s = new StringBuilder();
s.append( '[' );
Type idType;
if( persister == null ) {
s.append( "<null EntityPersister>" );
idType = null;
}
else {
s.append( persister.getEntityName() );
idType = persister.getIdentifierType();
}
s.append( '#' );
if ( id == null ) {
s.append( "<null>" );
}
else {
if ( idType == null ) {
s.append( id );
}
else {
if ( factory != null ) {
s.append( idType.toLoggableString( id, factory ) );
}
else {
s.append( "<not loggable>" );
}
}
}
s.append( ']' );
return s.toString();
}
Generate an info message string relating to a particular entity,.
Params: - persister – The persister for the entity
- id – The entity id value
- identifierType – The entity identifier type mapping
- factory – The session factory
Returns: An info string, in the form [FooBar#1]
/**
* Generate an info message string relating to a particular entity,.
*
* @param persister The persister for the entity
* @param id The entity id value
* @param identifierType The entity identifier type mapping
* @param factory The session factory
* @return An info string, in the form [FooBar#1]
*/
public static String infoString(
EntityPersister persister,
Object id,
Type identifierType,
SessionFactoryImplementor factory) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if( persister == null ) {
s.append( "<null EntityPersister>" );
}
else {
s.append( persister.getEntityName() );
}
s.append( '#' );
if ( id == null ) {
s.append( "<null>" );
}
else {
s.append( identifierType.toLoggableString( id, factory ) );
}
s.append( ']' );
return s.toString();
}
Generate an info message string relating to a series of entities.
Params: - persister – The persister for the entities
- ids – The entity id values
- factory – The session factory
Returns: An info string, in the form [FooBar#<1,2,3>]
/**
* Generate an info message string relating to a series of entities.
*
* @param persister The persister for the entities
* @param ids The entity id values
* @param factory The session factory
* @return An info string, in the form [FooBar#<1,2,3>]
*/
public static String infoString(
EntityPersister persister,
Serializable[] ids,
SessionFactoryImplementor factory) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if( persister == null ) {
s.append( "<null EntityPersister>" );
}
else {
s.append( persister.getEntityName() );
s.append( "#<" );
for ( int i=0; i<ids.length; i++ ) {
s.append( persister.getIdentifierType().toLoggableString( ids[i], factory ) );
if ( i < ids.length-1 ) {
s.append( ", " );
}
}
s.append( '>' );
}
s.append( ']' );
return s.toString();
}
Generate an info message string relating to given entity persister.
Params: - persister – The persister.
Returns: An info string, in the form [FooBar]
/**
* Generate an info message string relating to given entity persister.
*
* @param persister The persister.
* @return An info string, in the form [FooBar]
*/
public static String infoString(EntityPersister persister) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if ( persister == null ) {
s.append( "<null EntityPersister>" );
}
else {
s.append( persister.getEntityName() );
}
s.append( ']' );
return s.toString();
}
Generate an info message string relating to a given property value
for an entity.
Params: - entityName – The entity name
- propertyName – The name of the property
- key – The property value.
Returns: An info string, in the form [Foo.bars#1]
/**
* Generate an info message string relating to a given property value
* for an entity.
*
* @param entityName The entity name
* @param propertyName The name of the property
* @param key The property value.
* @return An info string, in the form [Foo.bars#1]
*/
public static String infoString(String entityName, String propertyName, Object key) {
StringBuilder s = new StringBuilder()
.append( '[' )
.append( entityName )
.append( '.' )
.append( propertyName )
.append( '#' );
if ( key == null ) {
s.append( "<null>" );
}
else {
s.append( key );
}
s.append( ']' );
return s.toString();
}
// collections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Generate an info message string relating to a particular managed
collection. Attempts to intelligently handle property-refs issues
where the collection key is not the same as the owner key.
Params: - persister – The persister for the collection
- collection – The collection itself
- collectionKey – The collection key
- session – The session
Returns: An info string, in the form [Foo.bars#1]
/**
* Generate an info message string relating to a particular managed
* collection. Attempts to intelligently handle property-refs issues
* where the collection key is not the same as the owner key.
*
* @param persister The persister for the collection
* @param collection The collection itself
* @param collectionKey The collection key
* @param session The session
* @return An info string, in the form [Foo.bars#1]
*/
public static String collectionInfoString(
CollectionPersister persister,
PersistentCollection collection,
Serializable collectionKey,
SharedSessionContractImplementor session ) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if ( persister == null ) {
s.append( "<unreferenced>" );
}
else {
s.append( persister.getRole() );
s.append( '#' );
Type ownerIdentifierType = persister.getOwnerEntityPersister()
.getIdentifierType();
Serializable ownerKey;
// TODO: Is it redundant to attempt to use the collectionKey,
// or is always using the owner id sufficient?
if ( collectionKey.getClass().isAssignableFrom(
ownerIdentifierType.getReturnedClass() ) ) {
ownerKey = collectionKey;
}
else {
Object collectionOwner = collection == null ? null : collection.getOwner();
EntityEntry entry = collectionOwner == null ? null : session.getPersistenceContext().getEntry(collectionOwner);
ownerKey = entry == null ? null : entry.getId();
}
s.append( ownerIdentifierType.toLoggableString(
ownerKey, session.getFactory() ) );
}
s.append( ']' );
return s.toString();
}
Generate an info message string relating to a series of managed
collections.
Params: - persister – The persister for the collections
- ids – The id values of the owners
- factory – The session factory
Returns: An info string, in the form [Foo.bars#<1,2,3>]
/**
* Generate an info message string relating to a series of managed
* collections.
*
* @param persister The persister for the collections
* @param ids The id values of the owners
* @param factory The session factory
* @return An info string, in the form [Foo.bars#<1,2,3>]
*/
public static String collectionInfoString(
CollectionPersister persister,
Serializable[] ids,
SessionFactoryImplementor factory) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if ( persister == null ) {
s.append( "<unreferenced>" );
}
else {
s.append( persister.getRole() );
s.append( "#<" );
for ( int i = 0; i < ids.length; i++ ) {
addIdToCollectionInfoString( persister, ids[i], factory, s );
if ( i < ids.length-1 ) {
s.append( ", " );
}
}
s.append( '>' );
}
s.append( ']' );
return s.toString();
}
Generate an info message string relating to a particular managed
collection.
Params: - persister – The persister for the collection
- id – The id value of the owner
- factory – The session factory
Returns: An info string, in the form [Foo.bars#1]
/**
* Generate an info message string relating to a particular managed
* collection.
*
* @param persister The persister for the collection
* @param id The id value of the owner
* @param factory The session factory
* @return An info string, in the form [Foo.bars#1]
*/
public static String collectionInfoString(
CollectionPersister persister,
Serializable id,
SessionFactoryImplementor factory) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if ( persister == null ) {
s.append( "<unreferenced>" );
}
else {
s.append( persister.getRole() );
s.append( '#' );
if ( id == null ) {
s.append( "<null>" );
}
else {
addIdToCollectionInfoString( persister, id, factory, s );
}
}
s.append( ']' );
return s.toString();
}
private static void addIdToCollectionInfoString(
CollectionPersister persister,
Serializable id,
SessionFactoryImplementor factory,
StringBuilder s ) {
// Need to use the identifier type of the collection owner
// since the incoming is value is actually the owner's id.
// Using the collection's key type causes problems with
// property-ref keys.
// Also need to check that the expected identifier type matches
// the given ID. Due to property-ref keys, the collection key
// may not be the owner key.
Type ownerIdentifierType = persister.getOwnerEntityPersister()
.getIdentifierType();
if ( id.getClass().isAssignableFrom(
ownerIdentifierType.getReturnedClass() ) ) {
s.append( ownerIdentifierType.toLoggableString( id, factory ) );
}
else {
// TODO: This is a crappy backup if a property-ref is used.
// If the reference is an object w/o toString(), this isn't going to work.
s.append( id.toString() );
}
}
Generate an info message string relating to a particular managed
collection.
Params: - role – The role-name of the collection
- id – The id value of the owner
Returns: An info string, in the form [Foo.bars#1]
/**
* Generate an info message string relating to a particular managed
* collection.
*
* @param role The role-name of the collection
* @param id The id value of the owner
* @return An info string, in the form [Foo.bars#1]
*/
public static String collectionInfoString(String role, Serializable id) {
StringBuilder s = new StringBuilder();
s.append( '[' );
if( role == null ) {
s.append( "<unreferenced>" );
}
else {
s.append( role );
s.append( '#' );
if ( id == null ) {
s.append( "<null>" );
}
else {
s.append( id );
}
}
s.append( ']' );
return s.toString();
}
}