blob: 616199081781f2252fc9d8c16d2e0767f5457ae3 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Thales Corporate Services S.A.S - initial API and implementation
*
* </copyright>
*/
package org.eclipse.egf.emf.pattern.codegen;
import static org.eclipse.egf.emf.pattern.codegen.CodegenFcoreUtil.N;
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.egf.emf.pattern.codegen.model.GIFPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.JetAbstractPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.JetPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.JetSubPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.MethodInfo;
import org.eclipse.egf.emf.pattern.codegen.model.PatternInfo;
import org.eclipse.egf.pattern.jet.JetTagsConstants;
/**
* @author Matthieu Helleboid
*
*/
public class CodegenPatternDescriptionHandler {
private static final Pattern EGF_REGEX = Pattern.compile(".fcore#" + JetTagsConstants.LOGICAL_NAME + "=([^\\\"]*)\\\""); //$NON-NLS-1$ //$NON-NLS-2$
protected IProject codegenProject;
protected String codegenEMFVersion;
public CodegenPatternDescriptionHandler(IProject codegenProject) {
this.codegenProject = codegenProject;
}
public void addCodegenEMFVersion(StringBuilder builder, CodegenVersionHelper codegenVersionHelper) throws Exception {
if (codegenEMFVersion == null) {
StringBuilder codegenEMFVersionBuilder = new StringBuilder();
codegenEMFVersionBuilder.append(codegenVersionHelper.getEMFCodegenEcoreVersion());
String emfEcoreVersion = codegenVersionHelper.getEMFEcoreVersion();
if (emfEcoreVersion != null) {
codegenEMFVersionBuilder.append(" from EMF "); //$NON-NLS-1$
codegenEMFVersionBuilder.append(emfEcoreVersion);
}
codegenEMFVersion = codegenEMFVersionBuilder.toString();
}
builder.append(codegenEMFVersion);
}
public void computeDescription(List<PatternInfo> patternInfos, CodegenVersionHelper codegenVersionHelper) throws Exception {
for (PatternInfo patternInfo : patternInfos) {
computeDescription(patternInfo, codegenVersionHelper);
}
}
protected void computeDescription(PatternInfo patternInfo, CodegenVersionHelper codegenVersionHelper) throws Exception {
StringBuilder builder = new StringBuilder();
addGeneratedFrom(patternInfo, builder, codegenVersionHelper);
builder.append(N);
addCalls(patternInfo, builder);
patternInfo.setDescription(builder.toString());
}
protected void addCalls(PatternInfo patternInfo, StringBuilder builder) {
boolean calls = false;
if (patternInfo instanceof JetAbstractPatternInfo) {
for (MethodInfo methodInfo : patternInfo.getMethods()) {
if (CodegenPatternMethodContentResolver.DO_GENERATE.equals(methodInfo.getName())) {
Matcher matcher = EGF_REGEX.matcher(methodInfo.getContent());
while (matcher.find()) {
String name = matcher.group(1);
if (!calls) {
builder.append("This pattern calls:"); //$NON-NLS-1$
builder.append(N);
calls = true;
}
builder.append(" * "); //$NON-NLS-1$
builder.append(name);
builder.append(N);
}
}
}
}
}
protected void addGeneratedFrom(PatternInfo patternInfo, StringBuilder builder, CodegenVersionHelper codegenVersionHelper) throws Exception {
builder.append("This pattern was generated from : "); //$NON-NLS-1$
builder.append("\n"); //$NON-NLS-1$
builder.append(" * Bundle "); //$NON-NLS-1$
builder.append(codegenProject.getName());
builder.append(" "); //$NON-NLS-1$
addCodegenEMFVersion(builder, codegenVersionHelper);
builder.append("\n"); //$NON-NLS-1$
builder.append(" * "); //$NON-NLS-1$
addTemplatePath(builder, patternInfo);
addTemplateVersion(builder, patternInfo, codegenVersionHelper);
}
protected void addTemplateVersion(StringBuilder builder, PatternInfo patternInfo, CodegenVersionHelper codegenVersionHelper) throws IOException, CoreException {
String templateVersion = null;
if (patternInfo instanceof JetPatternInfo) {
JetPatternInfo jetPatternInfo = (JetPatternInfo) patternInfo;
templateVersion = codegenVersionHelper.getTemplateVersion(jetPatternInfo.getJetTemplatePath());
} else if (patternInfo instanceof JetSubPatternInfo) {
JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
JetPatternInfo jetPatternInfo = (JetPatternInfo) jetSubPatternInfo.getSection().getRoot().getPatternInfo();
templateVersion = codegenVersionHelper.getTemplateVersion(jetPatternInfo.getJetTemplatePath());
}
if (templateVersion != null) {
builder.append("\n"); //$NON-NLS-1$
builder.append(" * Version "); //$NON-NLS-1$
builder.append(templateVersion);
}
}
protected void addTemplatePath(StringBuilder builder, PatternInfo patternInfo) {
if (patternInfo instanceof GIFPatternInfo)
return;
if (patternInfo instanceof JetPatternInfo) {
builder.append("Template \"templates/"); //$NON-NLS-1$
builder.append(((JetPatternInfo) patternInfo).getJetTemplatePath());
builder.append("\""); //$NON-NLS-1$
} else if (patternInfo instanceof JetSubPatternInfo) {
JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
JetAbstractPatternInfo rootPatternInfo = jetSubPatternInfo.getSection().getRoot().getPatternInfo();
addTemplatePath(builder, rootPatternInfo);
}
}
}