blob: 93f57efd9c10be0e0cf5682a7f43e26a5a62642b [file] [log] [blame]
/*******************************************************************************
* 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;
}
}