/*
* ******************************************************************************
* MontiCore Language Workbench
* Copyright (c) 2015, MontiCore, All rights reserved.
*
* This project 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.0 of the License, or (at your option) any later version.
* This library 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 project. If not, see <http://www.gnu.org/licenses/>.
* ******************************************************************************
*/
package de.monticore.codegen.cd2java.cocos;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import de.monticore.codegen.cd2java.ast.AstGeneratorHelper;
import de.monticore.codegen.cd2java.visitor.VisitorGenerator;
import de.monticore.codegen.cd2java.visitor.VisitorGeneratorHelper;
import de.monticore.generating.GeneratorEngine;
import de.monticore.generating.GeneratorSetup;
import de.monticore.generating.templateengine.GlobalExtensionManagement;
import de.monticore.symboltable.GlobalScope;
import de.monticore.umlcd4a.cd4analysis._ast.ASTCDClass;
import de.monticore.umlcd4a.cd4analysis._ast.ASTCDCompilationUnit;
import de.monticore.umlcd4a.cd4analysis._ast.ASTCDInterface;
import de.monticore.umlcd4a.symboltable.CDSymbol;
import de.se_rwth.commons.Names;
/**
* Generates the infrastructure for context conditions: For the different ast
* node types a corresponding coco-interface is generated. Their implementations
* can be registered at the generated CoCoChecker (basically a visitor that
* executes the registered cocos at the corresponding ast nodes).
*
* @author Robert Heim
*/
public class CoCoGenerator {
/**
* Generates the infrastructure for CoCos based on Visitor and the double
* dispatch mechanism of {@link VisitorGenerator}.
*/
public static void generate(GlobalExtensionManagement glex,
GlobalScope globalScope,
ASTCDCompilationUnit astClassDiagram, File outputDirectory) {
final GeneratorSetup setup = new GeneratorSetup(outputDirectory);
CoCoGeneratorHelper coCoHelper = new CoCoGeneratorHelper(astClassDiagram, globalScope);
glex.setGlobalValue("coCoHelper", coCoHelper);
setup.setGlex(glex);
final GeneratorEngine generator = new GeneratorEngine(setup);
final String diagramName = astClassDiagram.getCDDefinition().getName();
final String cocosPackage = coCoHelper.getCoCoPackage();
final String astPackage = CoCoGeneratorHelper.getPackageName(coCoHelper.getPackageName(),
AstGeneratorHelper.getAstPackageSuffix());
final String visitorPackage = CoCoGeneratorHelper.getPackageName(coCoHelper.getPackageName(),
VisitorGeneratorHelper.getVisitorPackageSuffix());
final CDSymbol cd = coCoHelper.getCd();
// TODO generate interfaces using cd instead of ast? Would prevent duplicate
// code
// concrete coco interfaces for AST classes
for (ASTCDClass clazz : astClassDiagram.getCDDefinition().getCDClasses()) {
if (coCoHelper.isAstClass(clazz)) {
final Path cocoFilePath = Paths.get(Names.getPathFromPackage(cocosPackage),
diagramName + CoCoGeneratorHelper.getPlainName(clazz) + "CoCo.java");
generator.generate("cocos.CoCoInterface", cocoFilePath, clazz, astPackage);
}
}
// concrete coco interfaces for AST interfaces classes
for (ASTCDInterface interf : astClassDiagram.getCDDefinition().getCDInterfaces()) {
final Path cocoFilePath = Paths.get(Names.getPathFromPackage(cocosPackage),
diagramName + CoCoGeneratorHelper.getPlainName(interf) + "CoCo.java");
generator.generate("cocos.CoCoInterface", cocoFilePath, interf, astPackage);
}
Collection<CDSymbol> allCds = coCoHelper.getAllCds(cd);
// coco checker
final String checkerType = diagramName + "CoCoChecker";
final Path cocoCheckerFilePath = Paths.get(Names.getPathFromPackage(cocosPackage), diagramName
+ "CoCoChecker.java");
generator.generate("cocos.CoCoChecker", cocoCheckerFilePath, astClassDiagram,
astClassDiagram.getCDDefinition(), astPackage, checkerType, visitorPackage, cd, allCds);
}
}