/*******************************************************************************
 * Copyright (c) 2001, 2006 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.wst.wsdl.ui.internal.text;

import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.internal.impl.DefinitionImpl;
import org.eclipse.wst.wsdl.internal.impl.WSDLElementImpl;
import org.eclipse.wst.wsdl.internal.impl.XSDSchemaExtensibilityElementImpl;
import org.eclipse.wst.wsdl.ui.internal.util.WSDLEditorUtil;
import org.eclipse.wst.wsdl.util.WSDLConstants;
import org.eclipse.xsd.impl.XSDSchemaImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;


class WSDLModelReconcileAdapter extends DocumentAdapter
{                             
  protected Definition definition;

  public WSDLModelReconcileAdapter(Document document, Definition definition)
  {           
    super(document);
    this.definition = definition;
  } 
   
     
  public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index) 
  {                      
    if (eventType == INodeNotifier.ADD)
    {
      if (newValue instanceof Element)
      {
        adapt((Element)newValue);

        // See Bug 5366
        // We need to sync up the Model and the DOM
        Element newDocumentElement = (Element)newValue;
        String wsdlPrefix = newDocumentElement.getPrefix();
        if (wsdlPrefix == null) wsdlPrefix = "";
        String ns = definition != null ? definition.getNamespace(wsdlPrefix) : "";
        if (ns != null && ns.equals(WSDLConstants.WSDL_NAMESPACE_URI)
           && newDocumentElement.getLocalName().equals(WSDLConstants.DEFINITION_ELEMENT_TAG)) // &&
           // !isValidDefinition)
        {
//          System.out.println("****** Setting new definition");
          definition.setElement(newDocumentElement);
        }
      }
    }   

    switch (eventType)
    {                  
      // we make the assumption that reconciling will only be triggered by one of these notifications 
      // (ADD and REMOVE notifications are omitted)
      //
      case INodeNotifier.CHANGE: 
      case INodeNotifier.STRUCTURE_CHANGED:
      case INodeNotifier.CONTENT_CHANGED:
      {                      
        if (notifier instanceof Element)
        {
          reconcileModelObjectForElement((Element)notifier, eventType, feature, oldValue, newValue, index);
        }
        else if (notifier instanceof Document)
        {
          Document document = (Document)notifier;
          Element definitionElement = null;          

          for (Node node = document.getFirstChild(); node != null; node = node.getNextSibling())
          {
            if (node.getNodeType() == Node.ELEMENT_NODE)
            {
              Element element = (Element)node;
              if (WSDLEditorUtil.getInstance().getWSDLType(element) == WSDLConstants.DEFINITION)
              {
                definitionElement = element;
                break;
              }
            }
          }
         
          // TODO... revisit definition.removeAllContent() and who should call this?
          //
          if (definitionElement != null)
          {
//            isValidDefinition = true;
//            System.out.println("VALID DEFINITION ELEMENT");
            WSDLModelAdapter modelAdapter = (WSDLModelAdapter) notifier.getAdapterFor(WSDLModelAdapter.class);
            if (modelAdapter != null) {
              definition = modelAdapter.getDefinition();
              if (definition == null) definition = modelAdapter.createDefinition(definitionElement, document);
            }
            ((DefinitionImpl)definition).elementChanged(definitionElement);
          }
          else
          {
//            System.out.println("INVALID DEFINITION ELEMENT");
//            isValidDefinition = false;
            ((DefinitionImpl)definition).removeAll();
          }
        }
        break;
      }
    }
  }

  protected void reconcileModelObjectForElement(Element element, int eventType, Object feature, Object oldValue, Object newValue, int index)
  {                                                                  
    Object modelObject = WSDLEditorUtil.getInstance().findModelObjectForElement(definition, element);  
    if (modelObject != null)
    {
      if (modelObject instanceof XSDSchemaExtensibilityElementImpl)
      {
        XSDSchemaExtensibilityElementImpl ee = (XSDSchemaExtensibilityElementImpl)modelObject;
        ((XSDSchemaImpl)ee.getSchema()).elementChanged(element);
        ee.elementChanged(element);            
      }   
      else if (modelObject instanceof WSDLElementImpl)
      {
        ((WSDLElementImpl)modelObject).elementChanged(element);
      }
    }     
  }   
}


abstract class DocumentAdapter implements INodeAdapter
{
  Document document;
  
  public DocumentAdapter(Document document)
  {
    this.document = document;
    ((INodeNotifier)document).addAdapter(this);
    if (document.getDocumentElement() != null) adapt(document.getDocumentElement());
  }

  public void adapt(Element element)
  {
    if (((INodeNotifier)element).getExistingAdapter(this) == null)
    {
      ((INodeNotifier)element).addAdapter(this);

      for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())
      {
        if (child.getNodeType() == Node.ELEMENT_NODE)
        {
          adapt((Element)child);
        }
      }
    }
  }

  public boolean isAdapterForType(Object type)
  {
    return type == this;
  }

  abstract public void notifyChanged
    (INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index);
}
