/*******************************************************************************
 * Copyright (c) 2004, 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.wst.ws.internal.explorer.platform.engine.transformer;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import org.eclipse.wst.ws.internal.datamodel.Element;
import org.eclipse.wst.ws.internal.datamodel.Rel;
import org.eclipse.wst.ws.internal.explorer.platform.constants.ActionInputs;
import org.eclipse.wst.ws.internal.explorer.platform.constants.ModelConstants;
import org.eclipse.wst.ws.internal.explorer.platform.datamodel.TreeElement;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.Controller;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.Node;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.NodeManager;

public class NodeSelectionTransformer implements ITransformer
{
  protected Controller controller;

  public NodeSelectionTransformer(Controller controller)
  {
    this.controller = controller;
  }

  public Hashtable normalize(Hashtable properties)
  {
    try
    {
      NodeManager nodeManager = controller.getCurrentPerspective().getNodeManager();
      Node nextNode = nodeManager.getNode(Integer.parseInt((String) properties.get(ActionInputs.NODEID)));
      Node currNode = nodeManager.getSelectedNode();
      if (currNode == null)
        currNode = nodeManager.getRootNode();
      Vector nextRels = new Vector();
      Vector currRels = new Vector();
      while (nextNode != null && currNode != null && (!isRootElement(nextNode.getTreeElement()) || !isRootElement(currNode.getTreeElement())) && nextNode != currNode)
      {
        if (nextNode.getNodeDepth() >= currNode.getNodeDepth())
        {
          Node parentNode = nextNode.getParent();
          Element nextElement = nextNode.getTreeElement();
          Rel rel = getRel(parentNode.getTreeElement(), nextElement);
          StringBuffer relValue = new StringBuffer(rel.getName());
          relValue.append(ModelConstants.REL_LOCALNAME_SEPARATOR);
          relValue.append(nextElement.getName());
          nextRels.insertElementAt(relValue.toString(), 0);
          nextNode = parentNode;
        }
        else
        {
          Node parentNode = currNode.getParent();
          Element parentElement = parentNode.getTreeElement();
          Rel rel = getRel(currNode.getTreeElement(), parentElement);
          StringBuffer relValue = new StringBuffer(rel.getName());
          relValue.append(ModelConstants.REL_LOCALNAME_SEPARATOR);
          relValue.append(parentElement.getName());
          currRels.add(relValue.toString());
          currNode = parentNode;
        }
      }
      currRels.addAll(nextRels);
      int numRelationships = currRels.size();
      if (numRelationships == 1)
        properties.put(ModelConstants.REL_ID, currRels.get(0).toString());
      else if (numRelationships > 1)
        properties.put(ModelConstants.REL_ID, (String[]) currRels.toArray(new String[0]));
    }
    catch (NumberFormatException nfe)
    {
    }
    return properties;
  }

  private boolean isRootElement(Element e)
  {
    return e.getModel().getRootElement() == e;
  }

  private Rel getRel(Element sourceElement, Element targetElement)
  {
    Enumeration rels = sourceElement.getRels();
    while (rels.hasMoreElements())
    {
      Rel rel = (Rel) rels.nextElement();
      Enumeration targetElements = rel.getTargetElements();
      while (targetElements.hasMoreElements())
      {
        if (targetElements.nextElement() == targetElement)
          return rel;
      }
    }
    return null;
  }

  public Hashtable deNormalize(Hashtable properties)
  {
    NodeManager nodeManager = controller.getCurrentPerspective().getNodeManager();
    Node rootNode = nodeManager.getRootNode();
    Node currNode = nodeManager.getSelectedNode();
    if (currNode == null)
      currNode = rootNode;
    Object value = properties.get(ModelConstants.REL_ID);
    String[] relationships = null;
    if (value instanceof String[])
      relationships = (String[]) value;
    else if (value != null)
      relationships = new String[]{value.toString()};
    if (relationships != null)
    {
      Element currElement = currNode.getTreeElement();
      for (int i = 0; i < relationships.length; i++)
      {
        int index = relationships[i].indexOf(ModelConstants.REL_LOCALNAME_SEPARATOR);
        String rel = (index != -1) ? relationships[i].substring(0, index) : relationships[i];
        String localname = (index != -1) ? relationships[i].substring(index + 1, relationships[i].length()) : null;
        Enumeration e = currElement.getElements(rel);
        Element targetElement = null;
        if (localname != null)
        {
          Element firstElement = null;
          while (e.hasMoreElements())
          {
            Element nextElement = (Element) e.nextElement();
            if (firstElement == null)
              firstElement = nextElement;
            if (localname.equals(nextElement.getName()))
            {
              targetElement = nextElement;
              break;
            }
          }
          if (targetElement == null)
            targetElement = firstElement;
        }
        else
        {
          if (e.hasMoreElements())
            targetElement = (Element) e.nextElement();
        }
        if (targetElement != null)
        {
          currElement = (Element) targetElement;
          Node parentNode = currNode.getParent();
          if (parentNode != null && parentNode.getTreeElement() == currElement)
            currNode = parentNode;
          else
            currNode = currNode.getChildNode((TreeElement) currElement);
        }
      }
    }
    properties.put(ActionInputs.NODEID, String.valueOf(currNode.getNodeId()));
    return properties;
  }
}
