/*
 * 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.event.internal;

import org.hibernate.AssertionFailure;
import org.hibernate.event.spi.EntityCopyObserver;
import org.hibernate.event.spi.EventSource;
import org.hibernate.pretty.MessageHelper;

/**
 * @author Gail Badner
 */
public class EntityCopyNotAllowedObserver implements EntityCopyObserver {

	public static final String SHORT_NAME = "disallow";

	@Override
	public void entityCopyDetected(
			Object managedEntity,
			Object mergeEntity1,
			Object mergeEntity2,
			EventSource session) {
		if ( mergeEntity1 == managedEntity && mergeEntity2 == managedEntity) {
			throw new AssertionFailure( "entity1 and entity2 are the same as managedEntity; must be different." );
		}
		final String managedEntityString = 	MessageHelper.infoString(
				session.getEntityName( managedEntity ),
				session.getIdentifier( managedEntity )
		);
		throw new IllegalStateException(
				"Multiple representations of the same entity " + managedEntityString + " are being merged. " +
						getManagedOrDetachedEntityString( managedEntity, mergeEntity1 ) + "; " +
						getManagedOrDetachedEntityString( managedEntity, mergeEntity2 )
		);
	}

	private String getManagedOrDetachedEntityString(Object managedEntity, Object entity ) {
		if ( entity == managedEntity) {
			return  "Managed: [" + entity + "]";
		}
		else {
			return "Detached: [" + entity + "]";
		}
	}

	public void clear() {
		// Nothing to do
	}

	@Override
	public void topLevelMergeComplete(EventSource session) {
		// Nothing to do
	}
}
