/**
* 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;
import static org.ow2.mind.NameHelper.toValidName;
import static org.ow2.mind.PathHelper.fullyQualifiedNameToPath;
import java.io.File;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import org.antlr.stringtemplate.StringTemplate;
import org.objectweb.fractal.adl.ADLException;
import org.objectweb.fractal.adl.CompilerError;
import org.objectweb.fractal.adl.Definition;
import org.ow2.mind.SourceFileWriter;
import org.ow2.mind.adl.graph.ComponentGraph;
import org.ow2.mind.io.IOErrors;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/**
* {@link InstanceSourceGenerator} component that generated {@value #FILE_EXT}
* files using the {@value #DEFAULT_TEMPLATE} template.
*/
public class BasicInstanceSourceGenerator extends AbstractSourceGenerator
implements
InstanceSourceGenerator {
/** The name to be used to inject the templateGroupName used by this class. */
public static final String TEMPLATE_NAME = "instances";
/** The default templateGroupName used by this class. */
public static final String DEFAULT_TEMPLATE = "st.instances.Component";
protected static final String FILE_EXT = ".c";
@Inject
protected BasicInstanceSourceGenerator(
@Named(TEMPLATE_NAME) final String templateGroupName) {
super(templateGroupName);
}
// ---------------------------------------------------------------------------
// public static methods
// ---------------------------------------------------------------------------
/**
* A static method that returns the name of the file that is generated by this
* component for the given {@link InstancesDescriptor};
*
* @param instanceDesc an {@link InstancesDescriptor} node.
* @return the name of the file that is generated by this component for the
* given {@link Definition};
*/
public static String getInstancesFileName(
final InstancesDescriptor instanceDesc) {
String outputFileName = toValidName(instanceDesc.topLevelDefinition
.getName());
outputFileName += "_"
+ toValidName(instanceDesc.instanceDefinition.getName()).replace('.',
'_') + "_instances";
outputFileName = fullyQualifiedNameToPath(outputFileName, FILE_EXT);
return outputFileName;
}
// ---------------------------------------------------------------------------
// Implementation of the InstanceSourceGenerator interface
// ---------------------------------------------------------------------------
public void visit(final InstancesDescriptor instanceDesc,
final Map<Object, Object> context) throws ADLException {
final File outputFile = outputFileLocatorItf.getCSourceOutputFile(
getInstancesFileName(instanceDesc), context);
if (regenerate(outputFile, instanceDesc.topLevelDefinition, context)) {
final StringTemplate st;
if (instanceDesc.topLevelDefinition == instanceDesc.instanceDefinition) {
st = getInstanceOf("TopLevelInstances");
st.setAttribute("topLevelDefinition", instanceDesc.topLevelDefinition);
st.setAttribute("instances", instanceDesc.instances);
final Set<Definition> definitions = new LinkedHashSet<Definition>();
for (final ComponentGraph instance : instanceDesc.instances) {
addDefinitions(instance, definitions);
}
st.setAttribute("definitions", definitions);
} else {
st = getInstanceOf("ComponentInstances");
st.setAttribute("topLevelDefinition", instanceDesc.topLevelDefinition);
st.setAttribute("definition", instanceDesc.instanceDefinition);
st.setAttribute("instances", instanceDesc.instances);
}
try {
SourceFileWriter.writeToFile(outputFile, st.toString());
} catch (final IOException e) {
throw new CompilerError(IOErrors.WRITE_ERROR, e,
outputFile.getAbsolutePath());
}
}
}
protected void addDefinitions(final ComponentGraph graph,
final Set<Definition> definitions) {
definitions.add(graph.getDefinition());
for (final ComponentGraph subComp : graph.getSubComponents()) {
addDefinitions(subComp, definitions);
}
}
}