/**
* 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: Ali Erdem Ozcan
* Contributors:
*/
package org.ow2.mind.st;
import java.util.HashMap;
import java.util.LinkedHashMap;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroupLoader;
public class BoundInterfaceMap extends HashMap<String, String> {
private static final long serialVersionUID = -7974148690318566114L;
public BoundInterfaceMap(final StringTemplateGroup group,
final String prefix, final String signature,
final StringTemplateGroupLoader pluginLoader) {
StringTemplateGroup subgroup;
// Always load considering the superGroup which is equal to our group in
// order to support nested template maps with multiple hierarchies.
subgroup = (StringTemplateGroup) pluginLoader.loadGroup(prefix, group);
if (!subgroup.implementsInterface(signature)) {
// Throw exception
}
for (final Object o : subgroup.getTemplateNames().toArray()) {
final String templateName = (String) o;
final String localTemplateName = "__" + prefix.replace('.', '_') + "_"
+ templateName;
this.put(templateName, localTemplateName);
// Get and prepare the receiver template
final StringTemplate receiverTemplate = subgroup
.getTemplateDefinition(templateName);
final StringTemplate skeletonTemplate = subgroup.defineTemplate(
templateName + "__Skeleton", receiverTemplate.getTemplate());
for (final String mapName : subgroup.getMapsKeySet()) {
skeletonTemplate.defineFormalArgument(mapName,
new MapDelegateStringTemplate(subgroup.getMap(mapName)));
}
// Create a stub template
final StringTemplate stubTemplate = group.defineTemplate(
localTemplateName, "<__skeleton_template>");
stubTemplate.setFormalArguments((LinkedHashMap<?, ?>) receiverTemplate
.getFormalArguments());
stubTemplate
.defineFormalArgument("__skeleton_template", skeletonTemplate);
}
}
}