/*******************************************************************************
 * Copyright (c) 2006, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation
 *
 ******************************************************************************/
package org.eclipse.persistence.tools.mapping.orm.dom;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.persistence.annotations.ExistenceType;
import org.eclipse.persistence.tools.mapping.orm.ExternalCache;
import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddable;
import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddedIDMapping;
import org.eclipse.persistence.tools.mapping.orm.ExternalEntityListener;
import org.eclipse.persistence.tools.mapping.orm.ExternalFetchGroup;
import org.eclipse.persistence.tools.mapping.orm.ExternalIDMapping;
import org.eclipse.persistence.tools.mapping.orm.ExternalMappedSuperClass;
import org.eclipse.persistence.tools.mapping.orm.ExternalMultitenancyPolicy;
import org.eclipse.persistence.tools.mapping.orm.ExternalOptimisticLocking;
import org.eclipse.persistence.tools.mapping.orm.ExternalPrimaryKey;
import org.eclipse.persistence.tools.mapping.orm.ExternalSequenceGenerator;
import org.eclipse.persistence.tools.mapping.orm.ExternalTableGenerator;
import org.eclipse.persistence.tools.mapping.orm.ExternalTransformationMapping;
import org.eclipse.persistence.tools.mapping.orm.ExternalVariableOneToOneMapping;
import org.eclipse.persistence.tools.mapping.orm.ExternalVersionMapping;
import org.eclipse.persistence.tools.utility.ObjectTools;
import org.eclipse.persistence.tools.utility.TextRange;
import org.w3c.dom.Element;

/**
 * The external form of an mapped superclass entity, which is a child of an ORM configuration.
 *
 * @see ORMConfiguration
 *
 * @version 2.6
 */
class MappedSuperClassEntity extends Embeddable
                             implements ExternalMappedSuperClass {

	/**
	 * Creates a new <code>MappedSuperClassEntity</code>.
	 *
	 * @param parent The parent of this external form
	 * @param index The position of the element within the list of children with the same type owned by the parent
	 */
	MappedSuperClassEntity(ORMConfiguration parent, int index) {
		super(parent, index);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalCache addCache() {
		Cache cache = buildCache();
		cache.addSelf();
		return cache;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalEmbeddedIDMapping addEmbeddedIdMapping(String name) {
		EmbeddedIDMapping mapping = buildEmbeddedIdMapping(mappingsSize());
		mapping.addSelf();
		mapping.setName(name);
		return mapping;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalEntityListener addEntityListener(String name) {
		EntityListener entityListener = buildEntityListener(-1);
		entityListener.addSelf();
		entityListener.setClassName(name);
		return entityListener;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalFetchGroup addFetchGroup(String name) {
		FetchGroup fetchGroup = buildFetchGroup(-1);
		fetchGroup.addSelf();
		fetchGroup.setName(name);
		return fetchGroup;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalIDMapping addIdMapping(String name) {
		IdMapping mapping = buildIdMapping(mappingsSize());
		mapping.addSelf();
		mapping.setName(name);
		return mapping;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalMultitenancyPolicy addMultitenancy() {
		MultitenancyPolicy multitenant = buildMultitenant();
		multitenant.addSelf();
		return multitenant;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalOptimisticLocking addOptimisticLocking() {
		OptimisticLocking optimisticLocking = buildOptimisticLocking();
		optimisticLocking.addSelf();
		return optimisticLocking;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalPrimaryKey addPrimaryKey() {
		PrimaryKey primaryKey = buildPrimaryKey();
		primaryKey.addSelf();
		return primaryKey;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public ExternalSequenceGenerator addSequenceGenerator() {
		SequenceGenerator sequenceGenerator = buildSequenceGenerator();
		sequenceGenerator.addSelf();
		return sequenceGenerator;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public ExternalTableGenerator addTableGenerator() {
		TableGenerator tableGenerator = buildTableGenerator();
		tableGenerator.addSelf();
		return tableGenerator;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalTransformationMapping addTransformationMapping(String name) {
		TransformationMapping mapping = buildTransformationMapping(mappingsSize());
		mapping.addSelf();
		mapping.setName(name);
		return mapping;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalVariableOneToOneMapping addVariableOneToOneMapping(String name) {
		VariableOneToOneMapping mapping = buildVariableOneToOneMapping(mappingsSize());
		mapping.addSelf();
		mapping.setName(name);
		return mapping;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalVersionMapping addVersionMapping(String name) {
		VersionMapping mapping = buildVersionMapping(mappingsSize());
		mapping.addSelf();
		mapping.setName(name);
		return mapping;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected List<String> buildAttributeNamesOrder() {
		List<String> names = new ArrayList<String>();
		names.add(ExternalEmbeddable.CLASS);
		names.add(PARENT_CLASS);
		names.add(ACCESS);
		names.add(CACHEABLE);
		names.add(METADATA_COMPLETE);
		names.add(READ_ONLY);
		names.add(EXISTENCE_CHECKING);
		names.add(EXCLUDE_DEFAULT_MAPPINGS);
		return names;
	}

	private Cache buildCache() {
		return new Cache(this);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected List<String> buildElementNamesOrder() {
		List<String> names = new ArrayList<String>();
		names.add(ExternalEmbeddable.DESCRIPTION);
		names.add(CUSTOMIZER);
		names.add(CHANGE_TRACKING);
		names.add(ID_CLASS);
		names.add(PrimaryKey.PRIMARY_KEY);
		names.add(OptimisticLocking.OPTIMISTIC_LOCKING);
		names.add(Cache.CACHE);
		names.add(CACHE_INTERCEPTOR);
		names.add(FetchGroup.FETCH_GROUP);
		names.add(Converter.CONVERTER);
		names.add(TypeConverter.TYPE_CONVERTER);
		names.add(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
		names.add(StructConverter.STRUCT_CONVERTER);
		names.add(CopyPolicy.COPY_POLICY);
		names.add(InstantiationCopyPolicy.INSTANTIATION_COPY_POLICY);
		names.add(CloneCopyPolicy.CLONE_COPY_POLICY);
		names.add(SequenceGenerator.SEQUENCE_GENERATOR);
		names.add(TableGenerator.TABLE_GENERATOR);
		names.add(EXCLUDE_DEFAULT_LISTENERS);
		names.add(EXCLUDE_SUPERCLASS_LISTENERS);
		names.add(EntityListener.ENTITY_LISTENERS);
		names.add(PRE_PERSIST);
		names.add(POST_PERSIST);
		names.add(PRE_REMOVE);
		names.add(POST_REMOVE);
		names.add(PRE_UPDATE);
		names.add(POST_UPDATE);
		names.add(POST_LOAD);
		names.add(Property.PROPERTY);
		names.add(Mapping.ATTRIBUTES);
		return names;
	}

	private EmbeddedIDMapping buildEmbeddedIdMapping(int index) {
		return new EmbeddedIDMapping(this, index);
	}

	private EntityListener buildEntityListener(int index) {
		return new EntityListener(this, index);
	}

	private FetchGroup buildFetchGroup(int index) {
		return new FetchGroup(this, index);
	}

	private IdMapping buildIdMapping(int index) {
		return new IdMapping(this, index);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	Mapping buildMapping(String elementName, int index) {

		// Embedded ID
		if (ObjectTools.equals(elementName, EmbeddedIDMapping.EMBEDDED_ID)) {
			return buildEmbeddedIdMapping(index);
		}

		// ID
		if (ObjectTools.equals(elementName, IdMapping.ID)) {
			return buildIdMapping(index);
		}

		// Transformation
		if (ObjectTools.equals(elementName, TransformationMapping.TRANSFORMATION)) {
			return buildTransformationMapping(index);
		}

		// Variable 1:1
		if (ObjectTools.equals(elementName, VariableOneToOneMapping.VARIABLE_ONE_TO_ONE)) {
			return buildVariableOneToOneMapping(index);
		}

		// Version
		if (ObjectTools.equals(elementName, VersionMapping.VERSION)) {
			return buildVersionMapping(index);
		}

		return super.buildMapping(elementName, index);
	}

	private MultitenancyPolicy buildMultitenant() {
		return new MultitenancyPolicy(this);
	}

	private OptimisticLocking buildOptimisticLocking() {
		return new OptimisticLocking(this);
	}

	private PrimaryKey buildPrimaryKey() {
		return new PrimaryKey(this);
	}

	private SequenceGenerator buildSequenceGenerator() {
		return new SequenceGenerator(this, -1);
	}

	private TableGenerator buildTableGenerator() {
		return new TableGenerator(this, -1);
	}

	private TransformationMapping buildTransformationMapping(int index) {
		return new TransformationMapping(this, index);
	}

	private VariableOneToOneMapping buildVariableOneToOneMapping(int index) {
		return new VariableOneToOneMapping(this, index);
	}

	private VersionMapping buildVersionMapping(int index) {
		return new VersionMapping(this, index);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final List<ExternalEntityListener> entityListeners() {

		int count = entityListenersSize();

		if (count == 0) {
			return Collections.emptyList();
		}

		List<ExternalEntityListener> entityListeners = new ArrayList<ExternalEntityListener>(count);

		for (int index = 0; index < count; index++) {
			entityListeners.add(buildEntityListener(index));
		}

		return entityListeners;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final int entityListenersSize() {

		Element element = getChild(EntityListener.ENTITY_LISTENERS);

		if (element != null) {
			return getChildrenSize(element, EntityListener.ENTITY_LISTENER);
		}

		return 0;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final List<ExternalFetchGroup> fetchGroups() {

		int count = fetchGroupsSize();
		List<ExternalFetchGroup> fetchGroups = new ArrayList<ExternalFetchGroup>(count);

		for (int index = 0; index < count; index++) {
			fetchGroups.add(buildFetchGroup(index));
		}

		return fetchGroups;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final int fetchGroupsSize() {
		return getChildrenSize(FetchGroup.FETCH_GROUP);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalCache getCache() {

		if (hasChild(Cache.CACHE)) {
			return buildCache();
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getCacheableTextRange() {
		return getAttributeTextRange(CACHEABLE);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getCacheInterceptorClassName() {
		return getChildAttribute(CACHE_INTERCEPTOR, ExternalEmbeddable.CLASS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getCacheInterceptorClassNameTextRange() {
		return getChildAttributeTextRange(CACHE_INTERCEPTOR, ExternalEmbeddable.CLASS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected String getElementName() {
		return MAPPED_SUPERCLASS;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalEntityListener getEntityListener(int index) {

		Element element = getChild(EntityListener.ENTITY_LISTENERS);

		if (element == null) {
			return null;
		}

		element = getChild(element, EntityListener.ENTITY_LISTENER, index);

		if (element == null) {
			return null;
		}

		return buildEntityListener(index);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getExcludesClassListenersTextRange() {
		return getChildTextRange(EXCLUDE_DEFAULT_LISTENERS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getExcludesSuperClassListenersTextRange() {
		return getChildTextRange(EXCLUDE_SUPERCLASS_LISTENERS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExistenceType getExistenceCheckingType() {
		return getEnumAttribute(EXISTENCE_CHECKING, ExistenceType.class);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getExistenceCheckingTypeTextRange() {
		return getAttributeTextRange(EXISTENCE_CHECKING);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalFetchGroup getFetchGroup(int index) {

		Element element = getChild(FetchGroup.FETCH_GROUP, index);

		if (element != null) {
			return buildFetchGroup(index);
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getIdClassName() {
		return getChildAttribute(ID_CLASS, ExternalEmbeddable.CLASS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getIdClassNameTextRange() {
		return getChildAttributeTextRange(ID_CLASS, ExternalEmbeddable.CLASS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getMappingsDescription() {
		return getChildTextNode(Mapping.ATTRIBUTES, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public ExternalMultitenancyPolicy getMultitenant() {

		if (hasChild(MultitenancyPolicy.MULTITENANT)) {
			return buildMultitenant();
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getMultitenantTextRange() {
		return getChildTextRange(MULTITENANT);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalOptimisticLocking getOptimisticLocking() {

		if (hasChild(OptimisticLocking.OPTIMISTIC_LOCKING)) {
			return buildOptimisticLocking();
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getParentClassName() {
		return getAttribute(PARENT_CLASS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getParentClassNameTextRange() {
		return getAttributeTextRange(PARENT_CLASS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostLoadMethod() {
		return getChildAttribute(POST_LOAD, METHOD_NAME);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostLoadMethodDescription() {
		return getChildTextNode(POST_LOAD, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getPostLoadMethodTextRange() {
		return getChildTextNodeTextRange(POST_LOAD, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostPersistMethod() {
		return getChildAttribute(POST_PERSIST, METHOD_NAME);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostPersistMethodDescription() {
		return getChildTextNode(POST_PERSIST, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getPostPersistMethodTextRange() {
		return getChildTextNodeTextRange(POST_PERSIST, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostRemoveMethod() {
		return getChildAttribute(POST_REMOVE, METHOD_NAME);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostRemoveMethodDescription() {
		return getChildTextNode(POST_REMOVE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getPostRemoveMethodTextRange() {
		return getChildTextNodeTextRange(POST_REMOVE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostUpdateMethod() {
		return getChildAttribute(POST_UPDATE, METHOD_NAME);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPostUpdateMethodDescription() {
		return getChildTextNode(POST_UPDATE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getPostUpdateMethodTextRange() {
		return getChildTextNodeTextRange(POST_UPDATE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPrePersistMethod() {
		return getChildAttribute(PRE_PERSIST, METHOD_NAME);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPrePersistMethodDescription() {
		return getChildTextNode(PRE_PERSIST, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getPrePersistMethodTextRange() {
		return getChildTextNodeTextRange(PRE_PERSIST, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPreRemoveMethod() {
		return getChildAttribute(PRE_REMOVE, METHOD_NAME);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPreRemoveMethodDescription() {
		return getChildTextNode(PRE_REMOVE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getPreRemoveMethodTextRange() {
		return getChildTextNodeTextRange(PRE_REMOVE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPreUpdateMethod() {
		return getChildAttribute(PRE_UPDATE, METHOD_NAME);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final String getPreUpdateMethodDescription() {
		return getChildTextNode(PRE_UPDATE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getPreUpdateMethodTextRange() {
		return getChildTextNodeTextRange(PRE_UPDATE, ExternalEmbeddable.DESCRIPTION);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final ExternalPrimaryKey getPrimaryKey() {

		if (hasChild(PrimaryKey.PRIMARY_KEY)) {
			return buildPrimaryKey();
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TextRange getReadOnlyTextRange() {
		return getAttributeTextRange(READ_ONLY);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public SequenceGenerator getSequenceGenerator() {

		if (hasChild(SequenceGenerator.SEQUENCE_GENERATOR)) {
			return buildSequenceGenerator();
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public TableGenerator getTableGenerator() {

		if (hasChild(TableGenerator.TABLE_GENERATOR)) {
			return buildTableGenerator();
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final Boolean isCacheable() {
		return getBooleanAttribute(CACHEABLE);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public Boolean isMultitenant() {
		return hasChild(MULTITENANT);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final Boolean isReadOnly() {
		return getBooleanAttribute(READ_ONLY);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void removeCache() {
		Cache cache = buildCache();
		cache.removeSelf();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void removeEntityListener(int index) {
		EntityListener entityListener = buildEntityListener(index);
		entityListener.removeSelf();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void removeFetchGroup(int index) {
		FetchGroup fetchGroup = buildFetchGroup(index);
		fetchGroup.removeSelf();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void removeMultiTenancy() {
		MultitenancyPolicy multitenant = buildMultitenant();
		multitenant.removeSelf();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void removeOptimisticLocking() {
		OptimisticLocking optimisticLocking = buildOptimisticLocking();
		optimisticLocking.removeSelf();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void removePrimaryKey() {
		PrimaryKey primaryKey = buildPrimaryKey();
		primaryKey.removeSelf();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setCacheable(Boolean isCacheable) {
		setAttribute(CACHEABLE, isCacheable);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setCacheInterceptorClassName(String className) {
		updateChildAttribute(CACHE_INTERCEPTOR, ExternalEmbeddable.CLASS, className);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setExcludesClassListeners(Boolean excludeClassListeners) {
		if (excludeClassListeners == Boolean.TRUE) {
			addChild(EXCLUDE_DEFAULT_LISTENERS);
		}
		else {
			removeChild(EXCLUDE_DEFAULT_LISTENERS);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setExcludesSuperClassListeners(Boolean excludesSuperClassListeners) {
		if (excludesSuperClassListeners == Boolean.TRUE) {
			addChild(EXCLUDE_SUPERCLASS_LISTENERS);
		}
		else {
			removeChild(EXCLUDE_SUPERCLASS_LISTENERS);
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setExistenceCheckingType(ExistenceType type) {
		setAttribute(EXISTENCE_CHECKING, type);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setIdClassName(String className) {
		updateChildAttribute(ID_CLASS, ExternalEmbeddable.CLASS, className);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setMappingsDescription(String description) {
		updateChildChildTextNode(Mapping.ATTRIBUTES, ExternalEmbeddable.DESCRIPTION, description);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setParentClassName(String className) {
		setAttribute(PARENT_CLASS, className);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostLoadMethod(String value) {
		updateChildAttribute(POST_LOAD, METHOD_NAME, value);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostLoadMethodDescription(String name) {
		updateChildChildTextNode(POST_LOAD, ExternalEmbeddable.DESCRIPTION, name);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostPersistMethod(String value) {
		updateChildAttribute(POST_PERSIST, METHOD_NAME, value);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostPersistMethodDescription(String name) {
		updateChildChildTextNode(POST_PERSIST, ExternalEmbeddable.DESCRIPTION, name);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostRemoveMethod(String value) {
		updateChildAttribute(POST_REMOVE, METHOD_NAME, value);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostRemoveMethodDescription(String name) {
		updateChildChildTextNode(POST_REMOVE, ExternalEmbeddable.DESCRIPTION, name);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostUpdateMethod(String value) {
		updateChildAttribute(POST_UPDATE, METHOD_NAME, value);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPostUpdateMethodDescription(String name) {
		updateChildChildTextNode(POST_UPDATE, ExternalEmbeddable.DESCRIPTION, name);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPrePersistMethod(String value) {
		updateChildAttribute(PRE_PERSIST, METHOD_NAME, value);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPrePersistMethodDescription(String name) {
		updateChildChildTextNode(PRE_PERSIST, ExternalEmbeddable.DESCRIPTION, name);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPreRemoveMethod(String value) {
		updateChildAttribute(PRE_REMOVE, METHOD_NAME, value);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPreRemoveMethodDescription(String name) {
		updateChildChildTextNode(PRE_REMOVE, ExternalEmbeddable.DESCRIPTION, name);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPreUpdateMethod(String value) {
		updateChildAttribute(PRE_UPDATE, METHOD_NAME, value);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setPreUpdateMethodDescription(String name) {
		updateChildChildTextNode(PRE_UPDATE, ExternalEmbeddable.DESCRIPTION, name);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final void setReadOnly(Boolean isReadOnly) {
		setAttribute(READ_ONLY, isReadOnly);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final Boolean shouldExcludesClassListeners() {
		return hasChild(EXCLUDE_DEFAULT_LISTENERS);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public final Boolean shouldExcludesSuperClassListeners() {
		return hasChild(EXCLUDE_SUPERCLASS_LISTENERS);
	}
}