/*******************************************************************************
 * Copyright (c) 2001, 2004 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.internal.ejb.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.internal.ejb.EjbPackage;
import org.eclipse.jst.j2ee.internal.ejb.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);
	}

}

