/*******************************************************************************
 * Copyright (c) 2004, 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;

import org.eclipse.core.runtime.Assert;
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.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;

/**
 * The adapter that listens to modification of faces-config and updates pageflow
 * as needed.
 * 
 * @author hmeng
 * 
 */

public class FC2PFSynchronizer extends AdapterImpl {
	private final boolean DEBUG = false;

	FC2PFTransformer transformer;

	private static final Logger logger = EditorPlugin
			.getLogger(FC2PFSynchronizer.class);

	/**
	 * @param transformer
	 */
	public FC2PFSynchronizer(FC2PFTransformer transformer) {
		this.transformer = transformer;
	}

	public Notifier getTarget() {
		// can't set target so return null
		return null;
	}

	public void setTarget(Notifier newTarget) {
        // do nothing
	}

	public boolean isAdapterForType(Object type) {
		return type == FC2PFSynchronizer.class;
	}

	public void notifyChanged(Notification notification) {
		if (!isProcessorFor(notification)) {
			return;
		}
		transformer.setInEvent(true);
		try {
			int type = notification.getEventType();
			switch (type) {
			case Notification.ADD: {
				processAdd(notification);
				notifyPageflow(notification);
				break;
			}
			case Notification.SET: {
				processSet(notification);
				notifyPageflow(notification);
				break;
			}
			case Notification.REMOVE:
				processRemove(notification);
				notifyPageflow(notification);
				break;
			}
		} catch (Exception e) {
			logger.error(e);
		} finally {
			if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
				transformer.refreshFCAdapter((EObject) notification
						.getNotifier());
				transformer.refreshPFAdapter(transformer.getPageflow());
			}
			transformer.setInEvent(false);
		}
	}

	private boolean isProcessorFor(Notification notification) {
		boolean result = false;
		if (transformer.isListenToNotify()
				&& (notification.getNotifier() instanceof EObject)) {
			if (notification.getNotifier() == transformer.getFacesConfig()) {
				// For faces-config, only navigation rule's change is awared.
				if (notification.getFeature() == FacesConfigPackage.eINSTANCE
						.getFacesConfigType_NavigationRule()) {
					result = true;
				}
			} else {
				result = true;
			}
		}
		return result;
	}

	private void processAdd(Notification notification) {
		Object feature = notification.getFeature();
		if (feature == FacesConfigPackage.eINSTANCE
				.getNavigationRuleType_NavigationCase()) {
			if (DEBUG)
				System.out.println("New navigation case");
			NavigationCaseType newCase = (NavigationCaseType) notification
					.getNewValue();
			transformer.updatePageflowElements(transformer.getPageflow(),
					newCase);
		} else if (feature == FacesConfigPackage.eINSTANCE
				.getFacesConfigType_NavigationRule()) {
			NavigationRuleType newRule = (NavigationRuleType) notification
					.getNewValue();
			if (newRule.getNavigationCase().size() > 0) {
				for (int i = 0; i < newRule.getNavigationCase().size(); i++) {
					transformer.updatePageflowElements(transformer
							.getPageflow(), (NavigationCaseType) newRule
							.getNavigationCase().get(i));
				}
			}
			if (DEBUG)
				System.out.println("New navigation rule");
		} else if (DEBUG)
			System.out.println("Something is added");
	}

	/**
	 * Notify pageflow the changes.
	 * 
	 * @param notification
	 */
	private void notifyPageflow(Notification notification) {
		Assert.isTrue(notification.getNotifier() instanceof InternalEObject);
		transformer.getPageflow().notifyModelChanged(
				new ENotificationImpl((InternalEObject) notification
						.getNotifier(), Notification.SET,
						PageflowPackage.PAGEFLOW, null, null));
	}

	/**
	 * Deal with the case when some element is removed.
	 * 
	 * @param notification
	 */
	private void processRemove(Notification notification) {
		if (notification.getFeature() == FacesConfigPackage.eINSTANCE
				.getNavigationRuleType_NavigationCase()) {
			if (notification.getOldValue() instanceof NavigationCaseType) {
				NavigationCaseType caseType = (NavigationCaseType) notification
						.getOldValue();
				transformer.removeLink(caseType);
			}
			if (DEBUG)
				System.out.println("Navigation case");
		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
				.getNavigationCaseType()) {
			if (notification.getOldValue() instanceof NavigationRuleType) {
				NavigationRuleType rule = (NavigationRuleType) notification
						.getOldValue();
				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
					NavigationCaseType caseType = (NavigationCaseType) rule
							.getNavigationCase().get(i);
					transformer.refreshLink(caseType);
				}
			}
			if (DEBUG)
				System.out.println("navigation rule");
		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
				.getFacesConfigType_NavigationRule()) {
			if (notification.getOldValue() instanceof NavigationRuleType) {
				NavigationRuleType rule = (NavigationRuleType) notification
						.getOldValue();
				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
					NavigationCaseType caseType = (NavigationCaseType) rule
							.getNavigationCase().get(i);
					transformer.refreshLink(caseType);
				}
			}
		}
		if (DEBUG)
			System.out.println("Something is removed");
	}

	/**
	 * Deal with property change.
	 * 
	 * @param notification
	 */
	private void processSet(Notification notification) {
		Object feature = notification.getFeature();
		if (feature == FacesConfigPackage.eINSTANCE
				.getFromViewIdType_TextContent()
				|| feature == FacesConfigPackage.eINSTANCE
						.getNavigationRuleType_FromViewId()) {
			fromViewIdChanged(notification);
		} else if (feature == FacesConfigPackage.eINSTANCE
				.getToViewIdType_TextContent()
				|| feature == FacesConfigPackage.eINSTANCE
						.getNavigationCaseType_ToViewId()) {
			toViewIdChanged(notification);
		}
		if (DEBUG)
			System.out.println("Something is set");
	}

	private void fromViewIdChanged(Notification notification) {
		// remove
		Object feature = notification.getFeature();
		if (feature == FacesConfigPackage.eINSTANCE
				.getNavigationRuleType_FromViewId()
				&& notification.getNewValue() == null
				&& notification.getOldValue() instanceof FromViewIdType) {
			NavigationRuleType rule = (NavigationRuleType) notification
					.getNotifier();
			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
				NavigationCaseType caseType = (NavigationCaseType) rule
						.getNavigationCase().get(i);
				transformer.refreshLink(caseType);
			}
		}
		// add or change
		else if (feature == FacesConfigPackage.eINSTANCE
				.getFromViewIdType_TextContent()) {
			NavigationRuleType rule = (NavigationRuleType) ((EObject) notification
					.getNotifier()).eContainer();
			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
				NavigationCaseType caseType = (NavigationCaseType) rule
						.getNavigationCase().get(i);
				transformer.refreshLink(caseType);
			}
		}
	}

	private void toViewIdChanged(Notification notification) {
		// remove
		Object feature = notification.getFeature();
		if (feature == FacesConfigPackage.eINSTANCE
				.getNavigationCaseType_ToViewId()
				&& notification.getNewValue() == null
				&& notification.getOldValue() instanceof ToViewIdType) {
			NavigationCaseType caseType = (NavigationCaseType) notification
					.getNotifier();
			transformer.refreshLink(caseType);
		}
		// add or change
		else if (feature == FacesConfigPackage.eINSTANCE
				.getToViewIdType_TextContent()) {
			NavigationCaseType caseType = (NavigationCaseType) ((EObject) notification
					.getNotifier()).eContainer();
			transformer.refreshLink(caseType);
		}
	}
}
