/**
* 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.generic;
import static org.ow2.mind.NameHelper.toValidName;
import static org.ow2.mind.PathHelper.fullyQualifiedNameToPath;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
import org.objectweb.fractal.adl.ADLException;
import org.objectweb.fractal.adl.CompilerError;
import org.objectweb.fractal.adl.Definition;
import org.objectweb.fractal.adl.error.GenericErrors;
import org.ow2.mind.adl.DefinitionSourceGenerator;
import org.ow2.mind.io.IOErrors;
import org.ow2.mind.io.OutputFileLocator;
import com.google.inject.Inject;
public class GenericDefinitionNameSourceGenerator
implements
DefinitionSourceGenerator {
public final static String FILE_EXT = ".map";
@Inject
protected OutputFileLocator outputFileLocatorItf;
// ---------------------------------------------------------------------------
// Implementation of the Visitor interface
// ---------------------------------------------------------------------------
public void visit(final Definition input, final Map<Object, Object> context)
throws ADLException {
final String name = input.getName();
final int i = name.indexOf('<');
if (i == -1) return;
final String templateName = name.substring(0, i);
final File mapFile = outputFileLocatorItf.getMetadataOutputFile(
fullyQualifiedNameToPath(templateName, FILE_EXT), context);
final Properties map = new Properties();
if (mapFile.exists()) {
FileInputStream mapInStream = null;
try {
mapInStream = new FileInputStream(mapFile);
map.load(mapInStream);
} catch (final FileNotFoundException e) {
// ignore
} catch (final IOException e) {
// ignore
} finally {
if (mapInStream != null) try {
mapInStream.close();
} catch (final IOException e) {
// ignore
}
}
}
final String previousName = (String) map.put(toValidName(name), name);
if (previousName != null && !previousName.equals(name)) {
throw new CompilerError(GenericErrors.INTERNAL_ERROR,
"Name clash in template instance name: \"" + name + "\" and \""
+ previousName + "\"");
}
FileOutputStream mapOutStream = null;
try {
mapOutStream = new FileOutputStream(mapFile);
map.store(mapOutStream, "Template instance names");
} catch (final FileNotFoundException e) {
throw new CompilerError(IOErrors.WRITE_ERROR, e,
mapFile.getAbsolutePath());
} catch (final IOException e) {
throw new CompilerError(IOErrors.WRITE_ERROR, e,
mapFile.getAbsolutePath());
} finally {
if (mapOutStream != null)
try {
mapOutStream.close();
} catch (final IOException e) {
throw new CompilerError(IOErrors.WRITE_ERROR, e,
mapFile.getAbsolutePath());
}
}
}
}