/*
* ******************************************************************************
* 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.generating.templateengine.reporting.reporter;
import java.io.File;
import java.util.Collection;
import java.util.List;
import de.monticore.ast.ASTNode;
import de.monticore.generating.templateengine.CodeHookPoint;
import de.monticore.generating.templateengine.HookPoint;
import de.monticore.generating.templateengine.StringHookPoint;
import de.monticore.generating.templateengine.TemplateHookPoint;
import de.monticore.generating.templateengine.reporting.Reporting;
import de.monticore.generating.templateengine.reporting.commons.AReporter;
import de.monticore.generating.templateengine.reporting.commons.Layouter;
import de.monticore.generating.templateengine.reporting.commons.ReportingConstants;
import de.monticore.generating.templateengine.reporting.commons.ReportingHelper;
import de.monticore.generating.templateengine.reporting.commons.ReportingRepository;
import de.se_rwth.commons.Names;
/**
* TODO: Write me!
*
* @author (last commit) $Author$
* @version $Revision$, $Date$
* @since TODO: add version number
*/
public class HookPointReporter extends AReporter {
final static String SET_HOOK_POINT = "set";
final static String SET_REPLACE_TEMPLATE = "setr";
final static String SET_BEFORE_TEMPLATE = "setb";
final static String SET_AFTER_TEMPLATE = "seta";
final static String CALL_HOOK_POINT = "call";
final static String CALL_REPLACE_TEMPLATE = "callr";
final static String CALL_BEFORE_TEMPLATE = "callb";
final static String CALL_AFTER_TEMPLATE = "calla";
final static String SIMPLE_FILE_NAME = "05_HookPoint";
private ReportingRepository repository;
public HookPointReporter(
String outputDir,
String modelName,
ReportingRepository repository) {
super(outputDir + File.separator + ReportingConstants.REPORTING_DIR
+ File.separator + modelName, SIMPLE_FILE_NAME,
ReportingConstants.REPORT_FILE_EXTENSION);
this.repository = repository;
}
/**
* @see mc.codegen.reporting.commons.DefaultReportEventHandler#reportASTSpecificTemplateReplacement(java.lang.String,
* de.monticore.ast.ASTNode, mc.codegen.HookPoint)
*/
@Override
public void reportASTSpecificTemplateReplacement(String oldTemplate,
ASTNode ast, HookPoint hp) {
String astName = repository.getASTNodeNameFormatted(ast);
String hpValue = getHookPointValue(hp);
String simpleTemplate = ReportingHelper.getTemplateName(oldTemplate);
String firstline = SET_HOOK_POINT
+ Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_1 - SET_HOOK_POINT.length());
if (hp instanceof TemplateHookPoint) {
firstline += "ATHP ";
}
else if (hp instanceof CodeHookPoint) {
firstline += "ACHP ";
}
else if (hp instanceof StringHookPoint) {
firstline += "ASHP ";
}
String secondLine = "";
firstline += simpleTemplate
+ Layouter.getSpaceString(ReportingConstants.COLUMN - simpleTemplate.length())
+ astName;
secondLine = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
Reporting.reportToDetailed(secondLine);
writeLine(secondLine);
}
/**
* @see mc.codegen.reporting.commons.DefaultReportEventHandler#reportSetHookPoint(java.lang.String,
* mc.codegen.HookPoint)
*/
@Override
public void reportSetHookPoint(String hookName, HookPoint hp) {
reportSetHookPointHelper(hookName, hp, SET_HOOK_POINT);
}
/**
* @see mc.codegen.reporting.commons.DefaultReportEventHandler#reportCallHookPointStart(java.lang.String,
* mc.codegen.HookPoint, de.monticore.ast.ASTNode)
*/
@Override
public void reportCallHookPointStart(String hookName, HookPoint hp,
ASTNode ast) {
String astName = repository.getASTNodeNameFormatted(ast);
String hpValue = getHookPointValue(hp);
String firstline = CALL_HOOK_POINT
+ Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_1 - CALL_HOOK_POINT.length());
boolean isThp = false;
boolean isShp = false;
if (hp instanceof TemplateHookPoint) {
firstline += "THP ";
isThp = true;
}
else if (hp instanceof CodeHookPoint) {
firstline += "CHP ";
}
else if (hp instanceof StringHookPoint) {
firstline += "SHP ";
isShp = true;
}
else {
firstline += "EHP ";
}
firstline += ReportingHelper.getHookPointName(hookName);
// hookpoint is null
if (hp == null) {
Reporting.reportToDetailed(firstline);
writeLine(firstline);
}
else {
// specific handling of TemplateHookPoint:
// THP contains an additional ASTNode
if (isThp) {
// template hookpoint -> astName in second line
firstline += Layouter.getSpaceString(ReportingConstants.COLUMN - ReportingHelper.getHookPointName(hookName)
.length()) + astName;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
String secondLineX = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(secondLineX);
writeLine(secondLineX);
}
else if (isShp) {
Reporting.reportToDetailed(firstline);
writeLine(firstline);
String secondLineX = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(secondLineX);
writeLine(secondLineX);
}
else { // chp
firstline += Layouter.getSpaceString(ReportingConstants.COLUMN - ReportingHelper.getHookPointName(hookName)
.length()) + hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
}
}
}
/**
* @see de.monticore.generating.templateengine.reporting.commons.DefaultReportEventHandler#reportCallAfterHookPoint(java.lang.String,
* java.util.Collection, de.monticore.ast.ASTNode)
*/
@Override
public void reportCallAfterHookPoint(String oldTemplate, Collection<HookPoint> afterHPs,
ASTNode ast) {
for (HookPoint hp : afterHPs) {
reportCallHookPointHelper(oldTemplate, hp, ast, CALL_AFTER_TEMPLATE);
}
}
/**
* @see de.monticore.generating.templateengine.reporting.commons.DefaultReportEventHandler#reportCallBeforeHookPoint(java.lang.String,
* java.util.Collection, de.monticore.ast.ASTNode)
*/
@Override
public void reportCallBeforeHookPoint(String oldTemplate, Collection<HookPoint> beforeHPs,
ASTNode ast) {
for (HookPoint hp : beforeHPs) {
reportCallHookPointHelper(oldTemplate, hp, ast, CALL_BEFORE_TEMPLATE);
}
}
/**
* @see de.monticore.generating.templateengine.reporting.commons.DefaultReportEventHandler#reportCallReplacementHookPoint(java.lang.String,
* java.util.List, de.monticore.ast.ASTNode)
*/
@Override
public void reportCallReplacementHookPoint(String oldTemplate, List<HookPoint> hps, ASTNode ast) {
for (HookPoint hp : hps) {
reportCallHookPointHelper(oldTemplate, hp, ast, CALL_REPLACE_TEMPLATE);
}
}
/**
* @see de.monticore.generating.templateengine.reporting.commons.DefaultReportEventHandler#reportCallSpecificReplacementHookPoint(java.lang.String,
* java.util.List, de.monticore.ast.ASTNode)
*/
@Override
public void reportCallSpecificReplacementHookPoint(String oldTemplate, List<HookPoint> hps,
ASTNode ast) {
for (HookPoint hp : hps) {
reportCallSpecificHookPointHelper(oldTemplate, hp, ast);
}
}
/**
* @see mc.codegen.reporting.commons.DefaultReportEventHandler#reportCallHookPointEnd(java.lang.String)
*/
@Override
public void reportCallHookPointEnd(String hookName) {
/* Uncomment this code line for increasing the log level */
// writeLine(CALL_HOOK_POINT_END + ": " + hookName);
}
/**
* @see mc.codegen.reporting.commons.DefaultReportEventHandler#reportTemplateReplacement(java.lang.String,
* java.util.List)
*/
@Override
public void reportTemplateReplacement(String oldTemplate,
List<? extends HookPoint> newHps) {
String simpleTemplate = ReportingHelper.getTemplateName(oldTemplate);
for (HookPoint hp : newHps) {
reportSetTemplateHookpoint(simpleTemplate, hp, SET_REPLACE_TEMPLATE);
}
}
/**
* @see mc.codegen.reporting.commons.DefaultReportEventHandler#reportSetBeforeTemplate(java.lang.String,
* java.util.List)
*/
@Override
public void reportSetBeforeTemplate(String template,
List<? extends HookPoint> beforeHps) {
String simpleTemplate = ReportingHelper.getTemplateName(template);
for (HookPoint hp : beforeHps) {
reportSetTemplateHookpoint(simpleTemplate, hp, SET_BEFORE_TEMPLATE);
}
}
/**
* @see mc.codegen.reporting.commons.DefaultReportEventHandler#reportSetAfterTemplate(java.lang.String,
* java.util.List)
*/
@Override
public void reportSetAfterTemplate(String template,
List<? extends HookPoint> afterHps) {
String simpleTemplate = ReportingHelper.getTemplateName(template);
for (HookPoint hp : afterHps) {
reportSetTemplateHookpoint(simpleTemplate, hp, SET_AFTER_TEMPLATE);
}
}
private void reportSetHookPointHelper(String hookName, HookPoint hp, String shortcut) {
String hpValue = getHookPointValue(hp);
// calculate first line
String firstline = shortcut
+ Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_1 - shortcut.length());
boolean isShp = false;
if (hp instanceof TemplateHookPoint) {
firstline += "THP ";
}
else if (hp instanceof CodeHookPoint) {
firstline += "CHP ";
}
else if (hp instanceof StringHookPoint) {
// string value of StringHookPoint is in an extra line
firstline += "SHP ";
isShp = true;
}
firstline += ReportingHelper.getHookPointName(hookName);
if (!isShp) {
firstline += Layouter.getSpaceString(ReportingConstants.COLUMN - ReportingHelper.getHookPointName(hookName)
.length()) + hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
}
else {
Reporting.reportToDetailed(firstline);
writeLine(firstline);
String secondLineX = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(secondLineX);
writeLine(secondLineX);
}
}
private void reportSetTemplateHookpoint(String simpleTemplate, HookPoint hp, String shortcut) {
// calculate first line
String firstline = shortcut
+ Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_1 - shortcut.length());
boolean shp = false;
if (hp instanceof TemplateHookPoint) {
firstline += "THP ";
}
else if (hp instanceof CodeHookPoint) {
firstline += "CHP ";
}
else if (hp instanceof StringHookPoint) {
firstline += "SHP ";
shp = true;
}
firstline += simpleTemplate + Layouter.getSpaceString(ReportingConstants.COLUMN - simpleTemplate.length());
String hpValue = getHookPointValue(hp);
if (!shp) {
firstline += hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
}
else {
// calculate and format second line
// contains StringValue
String secondline = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
Reporting.reportToDetailed(secondline);
writeLine(secondline);
}
}
private void reportCallHookPointHelper(String oldTemplate, HookPoint hp, ASTNode ast,
String shortcut) {
String astName = repository.getASTNodeNameFormatted(ast);
String hpValue = getHookPointValue(hp);
String simpleTemplate = ReportingHelper.getTemplateName(oldTemplate);
String firstline = shortcut
+ Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_1 - shortcut.length());
boolean isShp = false;
boolean isThp = false;
if (hp instanceof TemplateHookPoint) {
firstline += "THP ";
isThp = true;
}
else if (hp instanceof CodeHookPoint) {
firstline += "CHP ";
}
else if (hp instanceof StringHookPoint) {
firstline += "SHP ";
isShp = true;
}
String secondLine = "";
if (isShp) {
firstline += simpleTemplate;
secondLine = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
Reporting.reportToDetailed(secondLine);
writeLine(secondLine);
}
else if (isThp) {
firstline += simpleTemplate
+ Layouter.getSpaceString(ReportingConstants.COLUMN - simpleTemplate.length())
+ astName;
secondLine = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
Reporting.reportToDetailed(secondLine);
writeLine(secondLine);
}
else {
firstline += simpleTemplate
+ Layouter.getSpaceString(ReportingConstants.COLUMN - simpleTemplate.length())
+ hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
}
}
private void reportCallSpecificHookPointHelper(String oldTemplate, HookPoint hp, ASTNode ast) {
String astName = repository.getASTNodeNameFormatted(ast);
String hpValue = getHookPointValue(hp);
String simpleTemplate = ReportingHelper.getTemplateName(oldTemplate);
String firstline = CALL_HOOK_POINT
+ Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_1 - CALL_HOOK_POINT.length());
if (hp instanceof TemplateHookPoint) {
firstline += "ATHP ";
}
else if (hp instanceof CodeHookPoint) {
firstline += "ACHP ";
}
else if (hp instanceof StringHookPoint) {
firstline += "ASHP ";
}
String secondLine = "";
firstline += simpleTemplate
+ Layouter.getSpaceString(ReportingConstants.COLUMN - simpleTemplate.length())
+ astName;
secondLine = Layouter.getSpaceString(ReportingConstants.FORMAT_LENGTH_2) + hpValue;
Reporting.reportToDetailed(firstline);
writeLine(firstline);
Reporting.reportToDetailed(secondLine);
writeLine(secondLine);
}
private String getHookPointValue(HookPoint hp) {
String value = null;
if (hp != null && hp instanceof TemplateHookPoint) {
value = ((TemplateHookPoint) hp).getTemplateName();
value = ReportingHelper.getTemplateName(value);
}
else if (hp != null && hp instanceof StringHookPoint) {
value = ((StringHookPoint) hp).getValue();
value = ReportingHelper.formatStringToReportingString(value,
ReportingConstants.REPORTING_ROW_LENGTH - ReportingConstants.FORMAT_LENGTH_2);
}
else if (hp != null && hp instanceof CodeHookPoint) {
value = ((CodeHookPoint) hp).getClass().getName();
value = Names.getSimpleName(value);
}
return value;
}
@Override
public void flush(ASTNode ast) {
writeFooter();
super.flush(ast);
}
private void writeFooter() {
writeLine("========================================================== Explanation");
writeLine("The events are the following:");
writeLine(" - set hook point assignment");
writeLine(" - setr template replacement by hook points");
writeLine(" - setb assignment of hook points that are called before the template ");
writeLine(" - seta assignment of hook points that are called after the template ");
writeLine(" - call hook point execution");
writeLine(" - callr execution of hook points that replaced a template");
writeLine(" - callb execution of hook points that are called before the template");
writeLine(" - calla execution of hook points that are called after the template");
writeLine("Hookpoints: ");
writeLine(" - SHP StringHookPoint");
writeLine(" - THP TemplateHookPoint");
writeLine(" - CHP CodeHookPoint");
writeLine(" - EHP EmptyHookPoint = HookPoint is null");
writeLine(" - ASHP AST StringHookPoint");
writeLine(" - ATHP AST TemplateHookPoint");
writeLine(" - ACHP AST CodeHookPoint");
writeLine("(EOF)");
}
@Override
protected void writeHeader() {
writeLine("========================================================== Hookpoints");
writeLine("Op"
+ Layouter.getSpaceString(4) + "Type"
+ Layouter.getSpaceString(1) + "HP-/AHP Info");
}
}