/**
* Copyright (C) 2009 STMicroelectronics
*
* This file is part of "Mind Compiler" is free software: you can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Contact: mind@ow2.org
*
* Authors: Matthieu Leclercq
* Contributors:
*/
package org.ow2.mind.adl.graph;
import static org.ow2.mind.NameHelper.toValidName;
import java.util.Map;
import org.objectweb.fractal.adl.ADLException;
import org.objectweb.fractal.adl.Definition;
import org.ow2.mind.adl.ast.ASTHelper;
import org.ow2.mind.adl.graph.Instantiator.AbstractDelegatingInstantiator;
import org.ow2.mind.error.ErrorManager;
import com.google.inject.Inject;
public class InstanceNameInstantiator extends AbstractDelegatingInstantiator {
@Inject
protected ErrorManager errorManagerItf;
// ---------------------------------------------------------------------------
// Implementation of the Instantiator interface
// ---------------------------------------------------------------------------
public ComponentGraph instantiate(final Definition definition,
final Map<Object, Object> context) throws ADLException {
final ComponentGraph graph = clientInstantiatorItf.instantiate(definition,
context);
initInstanceName(graph, "");
return graph;
}
protected void initInstanceName(final ComponentGraph graph, String path) {
String instanceName = (String) graph.getDecoration("instance-name");
if (instanceName == null) {
final Definition def = graph.getDefinition();
if (ASTHelper.isSingleton(def)) {
// component is a singleton
instanceName = "__component_" + toValidName(def.getName())
+ "_singleton_instance";
} else {
if (graph.getParents().length == 0) {
// top level component
instanceName = "__component_" + toValidName(def.getName());
} else {
instanceName = path + "_"
+ graph.getNameInParent(graph.getParents()[0]);
}
}
graph.setDecoration("instance-name", instanceName);
if (graph.getParents().length == 0) {
// top level component
path = "__component_" + toValidName(def.getName());
} else {
path = path + "_" + graph.getNameInParent(graph.getParents()[0]);
}
for (final ComponentGraph subComponent : graph.getSubComponents()) {
initInstanceName(subComponent, path);
}
}
}
}