blob: d1469e3922f4699deb8302ceb290a1a77bb1f286 [file] [log] [blame]
/*
* Copyright (c) 2006 Borland Software Corporation
*
* 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:
* Artem Tikhomirov (Borland) - initial API and implementation
*/
package org.eclipse.gmf.internal.bridge;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.gmf.codegen.gmfgen.GenChildNode;
import org.eclipse.gmf.codegen.gmfgen.GenLink;
import org.eclipse.gmf.codegen.gmfgen.GenMetricRule;
import org.eclipse.gmf.codegen.gmfgen.GenNode;
import org.eclipse.gmf.codegen.gmfgen.GenTopLevelNode;
import org.eclipse.gmf.mappings.LinkMapping;
import org.eclipse.gmf.mappings.MetricRule;
import org.eclipse.gmf.mappings.NodeMapping;
/**
* Keep track of gmfmap-to-gmfgen transformation elements.
* @author artem
*/
public class History {
private final Map<NodeMapping, GenTopLevelNode> myTopNodeMap;
private final Map<NodeMapping, Set<GenChildNode>> myNodeMap;
private final Map<LinkMapping, GenLink> myLinkMap;
private final Map<MetricRule, GenMetricRule> myMetricMap;
public History() {
myTopNodeMap = new HashMap<NodeMapping, GenTopLevelNode>();
myNodeMap = new HashMap<NodeMapping, Set<GenChildNode>>();
myLinkMap = new HashMap<LinkMapping, GenLink>();
myMetricMap = new HashMap<MetricRule, GenMetricRule>();
}
/**
* No more then 1 GenTopLevelNode may be logged for node mapping
*/
public void log(NodeMapping nodeMap, GenTopLevelNode genNode) {
assert nodeMap != null && genNode != null && !myTopNodeMap.containsKey(nodeMap);
myTopNodeMap.put(nodeMap, genNode);
}
/**
* More than 1 GenChildNode may be logged for node mapping
* (to handle children taken from different containment/children features)
*/
public void log(NodeMapping nodeMap, GenChildNode genNode) {
assert nodeMap != null && genNode != null;
Set<GenChildNode> genNodes = myNodeMap.get(nodeMap);
if (genNodes == null) {
genNodes = new HashSet<GenChildNode>();
myNodeMap.put(nodeMap, genNodes);
}
genNodes.add(genNode);
}
/**
* No more than 1 GenLink is allowed for link mapping.
*/
public void log(LinkMapping linkMap, GenLink genLink) {
assert linkMap != null && genLink != null && !myLinkMap.containsKey(linkMap);
myLinkMap.put(linkMap, genLink);
}
public void log(MetricRule metric, GenMetricRule genMetric) {
assert metric != null && genMetric != null;
myMetricMap.put(metric, genMetric);
}
public GenMetricRule find(MetricRule metric) {
assert metric != null;
return myMetricMap.get(metric);
}
public boolean isKnown(NodeMapping nodeMap) {
return isKnownTopNode(nodeMap) || isKnownChildNode(nodeMap);
}
public boolean isKnownTopNode(NodeMapping nodeMap) {
assert nodeMap != null;
return myTopNodeMap.containsKey(nodeMap);
}
public boolean isKnownChildNode(NodeMapping nodeMap) {
assert nodeMap != null;
// We don't check stored collections as there's no means to remove element from this history,
// thus, no way to get empty collection
return myNodeMap.containsKey(nodeMap);
}
public boolean isKnown(LinkMapping linkMap) {
assert linkMap != null;
return myLinkMap.containsKey(linkMap);
}
/**
* @return never <code>null</code>>
*/
public GenChildNode[] findChildNodes(NodeMapping nodeMap) {
assert nodeMap != null;
Set<GenChildNode> genNodes = myNodeMap.get(nodeMap);
if (genNodes == null) {
return new GenChildNode[0];
}
return genNodes.toArray(new GenChildNode[genNodes.size()]);
}
public GenTopLevelNode findTopNode(NodeMapping nodeMap) {
assert nodeMap != null;
return myTopNodeMap.get(nodeMap);
}
public GenNode[] find(NodeMapping nodeMap) {
assert nodeMap != null;
GenNode genNode = findTopNode(nodeMap);
return genNode != null ? new GenNode[] {genNode} : findChildNodes(nodeMap);
}
public GenLink find(LinkMapping linkMap) {
assert linkMap != null;
return myLinkMap.get(linkMap);
}
public void purge() {
myTopNodeMap.clear();
myNodeMap.clear();
myLinkMap.clear();
myMetricMap.clear();
}
}