/*******************************************************************************
 * Copyright (c) 2001, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.ejb.internal.util;
import java.util.List;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jst.j2ee.ejb.CMPAttribute;
import org.eclipse.jst.j2ee.ejb.CommonRelationship;
import org.eclipse.jst.j2ee.ejb.CommonRelationshipRole;
import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity;
import org.eclipse.jst.j2ee.ejb.EjbPackage;
import org.eclipse.jst.j2ee.ejb.internal.impl.EjbFactoryImpl;

public abstract class CommonRelationshipAttributeMaintenanceAdapter extends AdapterImpl {
	protected static EjbPackage EJB_PACK = EjbFactoryImpl.getPackage();
	/**
	 * Constructor for CommonRelationshipAttributeMaintenanceAdapter.
	 */
	public CommonRelationshipAttributeMaintenanceAdapter() {
		super();
	}
	/**
	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(Notification)
	 */
	public void notifyChanged(Notification msg) {
		switch (msg.getEventType()) {
			case Notification.ADD :
				addedNotification(msg);
				break;
			case Notification.REMOVE :
				removedNotification(msg);
				break;
		}
	}
	protected void addedNotification(Notification msg) {
		if ((EStructuralFeature)msg.getFeature() == EJB_PACK.getContainerManagedEntity_KeyAttributes())
			addedKeyAttribute((ContainerManagedEntity) msg.getNotifier(), (CMPAttribute) msg.getNewValue());
		else if (isRelationshipsSF((EStructuralFeature)msg.getFeature()))
			added();
		else if (isRelationshipRolesSF((EStructuralFeature)msg.getFeature()))
			addedRole((CommonRelationshipRole) msg.getNewValue());
	}
	protected void removedNotification(Notification msg) {
		if ((EStructuralFeature)msg.getFeature() == EJB_PACK.getContainerManagedEntity_KeyAttributes())
			removedKeyAttribute((ContainerManagedEntity) msg.getNotifier(), (CMPAttribute) msg.getOldValue());
		else if (isRelationshipsSF((EStructuralFeature)msg.getFeature()))
			removed();
		else if (isRelationshipRolesSF((EStructuralFeature)msg.getFeature()))
			removedRole((CommonRelationshipRole) msg.getOldValue());
	}
	protected abstract boolean isRelationshipRolesSF(EObject sf);
	protected abstract boolean isRelationshipsSF(EObject sf);
	//Same as the add
	private void removedKeyAttribute(ContainerManagedEntity aCMPEntity, CMPAttribute cmpAttribute) {
		addedKeyAttribute(aCMPEntity, cmpAttribute);
	}
	protected void addedKeyAttribute(ContainerManagedEntity aCMPEntity, CMPAttribute newAttribute) {
		CommonRelationshipRole role, inverse;
		role = getRole(aCMPEntity);
		if (role != null && !role.isForward()) {
			inverse = role.getOppositeAsCommonRole();
			if (inverse != null)
				inverse.reconcileAttributes();
		}
	}
	protected CommonRelationshipRole getRole(ContainerManagedEntity aCMPEntity) {
	    CommonRelationship relation = getRelationship();
	    if (relation == null) return null;
		List roles = relation.getCommonRoles();
		if (roles.isEmpty())
			return null;
		CommonRelationshipRole role = null;
		for (int i = 0; i < roles.size(); i++) {
			role = (CommonRelationshipRole) roles.get(i);
			if (role.getSourceEntity() == aCMPEntity)
				return role;
		}
		return role;
	}
	protected CommonRelationship getRelationship() {
		return  (CommonRelationship) getTarget();
	}
	protected void reconcileRoleAttributes() {
		List roles = getRelationship().getCommonRoles();
		if (roles.isEmpty())
			return;
		CommonRelationshipRole role = null;
		for (int i = 0; i < roles.size(); i++) {
			role = (CommonRelationshipRole) roles.get(i);
			role.reconcileAttributes();
		}
	}
	protected void added() {
		reconcileRoleAttributes();
	}
	protected void removed() {
		if (getRelationship().getCommonRoles().size() > 1) {
			//remove one force a disconnect
			getRelationship().getCommonRoles().remove(0);
		}
	}
	/**
	* Add this Adapter to @aRole and the ContainerManagedEntity
	* that the ContainerManagedEntityExtension container is pointing to.
	* This only works if @aRole is contained.
	*/
	protected void addAdaptors(CommonRelationshipRole aRole) {
		removeAdaptors(aRole); //to ensure this adapter is not added twice
		aRole.eAdapters().add(this);
		ContainerManagedEntity cmp = aRole.getSourceEntity();
		if (cmp != null)
			cmp.eAdapters().add(this);
	}
	/**
	 * Remove this Adapter from @aRole and the ContainerManagedEntity
	 * that the ContainerManagedEntityExtension container is pointing to.
	 * This only works if @aRole is contained.
	 */
	protected void removeAdaptors(CommonRelationshipRole aRole) {
		aRole.eAdapters().remove(this);
		ContainerManagedEntity cmp = aRole.getSourceEntity();
		if (cmp != null)
			cmp.eAdapters().remove(this);
	}
	protected void addedRole(CommonRelationshipRole aRole) {
		addAdaptors(aRole);
		if ((getRelationship().eContainer() != null) && rolesFullyReflected())
			reconcileRoleAttributes();
	}
	protected boolean rolesFullyReflected() {
		List roles = getRelationship().getCommonRoles();
		if (roles.isEmpty())
			return false;
		CommonRelationshipRole role = null;
		for (int i = 0; i < roles.size(); i++) {
			role = (CommonRelationshipRole) roles.get(i);
			if (role.getSourceEntity() == null)
				return false;
		}
		return true;
	}
		
	protected void removedRole(CommonRelationshipRole aRole) {
		removeAdaptors(aRole);
		if (getRelationship().eContainer() != null) {
			aRole.reconcileAttributes();
			reconcileRoleAttributes();
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#setTarget(org.eclipse.emf.common.notify.Notifier)
	 */
	public void setTarget(Notifier notifier) {
		//Only set the target if it is a CommonRelationship
		if (notifier == null || notifier instanceof CommonRelationship)
			super.setTarget(notifier);
	}

}

