blob: 8ed3f59fc528d79916802deeef174b0493b7c5c1 [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.pattern.jet.engine;
import org.eclipse.egf.common.constant.EGFCommonConstants;
import org.eclipse.egf.model.pattern.Pattern;
import org.eclipse.egf.model.pattern.PatternException;
import org.eclipse.egf.model.pattern.PatternParameter;
import org.eclipse.egf.model.pattern.Query;
import org.eclipse.egf.pattern.common.java.BaseJavaAssemblyHelper;
import org.eclipse.egf.pattern.engine.PatternHelper;
import org.eclipse.egf.pattern.l10n.EGFPatternMessages;
import org.eclipse.egf.pattern.utils.ParameterTypeHelper;
/**
* @author Thomas Guiu
*
*/
public class JetAssemblyHelper extends BaseJavaAssemblyHelper {
public JetAssemblyHelper(Pattern pattern, JetAssemblyContentProvider contentProvider) {
super(pattern, contentProvider);
}
@Override
protected void beginOrchestration() throws PatternException {
content.append("<%"); //$NON-NLS-1$
content.append("InternalPatternContext ctx = (InternalPatternContext)argument;").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append("Map<String, String> queryCtx = null;").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append("IQuery.ParameterDescription paramDesc = null;").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append("%>"); //$NON-NLS-1$
super.beginOrchestration();
content.append("<%").append(START_LOOP_MARKER).append("%>"); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
protected void endOrchestration() throws PatternException {
content.append("<%").append(END_LOOP_MARKER).append("%>"); //$NON-NLS-1$ //$NON-NLS-2$
if (pattern.getAllParameters().isEmpty()) {
content.append("<%if (ctx.useReporter()){").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append(" ctx.getReporter().executionFinished(ctx.getExecutionBuffer().toString(), ctx);").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append(" ctx.clearBuffer();}%>").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
return;
}
// 1 - Add pre block at insertionIndex
StringBuilder localContent = new StringBuilder(300);
localContent.append("<%").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
for (PatternParameter parameter : pattern.getAllParameters()) {
appendQueryCode(localContent, parameter);
}
localContent.append(EGFCommonConstants.LINE_SEPARATOR).append(EGFCommonConstants.LINE_SEPARATOR);
// create a loop per parameter
for (PatternParameter parameter : pattern.getAllParameters()) {
String local = PatternHelper.localizeName(parameter);
localContent.append("for (Object ").append(local).append(" : ").append(getParameterListName(parameter)).append(" ) {").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
localContent.append(EGFCommonConstants.LINE_SEPARATOR);
for (org.eclipse.egf.model.pattern.PatternParameter parameter : pattern.getAllParameters()) {
String local = PatternHelper.localizeName(parameter);
String type = ParameterTypeHelper.INSTANCE.getSourceTypeLiteral(parameter.getType());
localContent.append("this.").append(parameter.getName()).append(" = (").append(type).append(")").append(local).append(";").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
localContent.append(EGFCommonConstants.LINE_SEPARATOR).append("%>"); //$NON-NLS-1$
content.insert(orchestrationIndex, localContent);
// 2 - Add post block at current index
content.append("<%").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
for (int i = 0; i < pattern.getAllParameters().size(); i++)
content.append("}").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append("if (ctx.useReporter()){").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append(" ctx.getReporter().executionFinished(ctx.getExecutionBuffer().toString(), ctx);").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append(" ctx.clearBuffer();").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
content.append("}%>"); //$NON-NLS-1$
// 3- Add additional code for parameter names handling
int startIndex = content.indexOf(START_LOOP_MARKER);
if (startIndex == -1)
throw new PatternException(EGFPatternMessages.assembly_error2);
// localContent.setLength(0);
// localContent.append(EGFCommonConstants.LINE_SEPARATOR);
// localContent.append("Map<String, Object> parameterValues = new HashMap<String, Object>();").append(EGFCommonConstants.LINE_SEPARATOR);
// for (org.eclipse.egf.model.pattern.PatternParameter parameter :
// pattern.getAllParameters()) {
// String local = PatternHelper.localizeName(parameter);
// String type =
// ParameterTypeHelper.INSTANCE.getTypeLiteral(parameter.getType());
// localContent.append(type).append(" ").append(parameter.getName()).append(" = (").append(type).append(")").append(local).append(";").append(EGFCommonConstants.LINE_SEPARATOR);
// localContent.append("parameterValues.put(\"").append(parameter.getName()).append("\", ").append(local).append(");").append(EGFCommonConstants.LINE_SEPARATOR);
// }
// content.insert(startIndex + START_LOOP_MARKER.length(),
// localContent);
}
private String getParameterListName(PatternParameter parameter) {
return parameter.getName() + "List"; //$NON-NLS-1$
}
@SuppressWarnings("unused")
private void appendQueryCode(StringBuilder localContent, PatternParameter parameter) throws PatternException {
Query query = parameter.getQuery();
if (query == null) {
// there is no query, so this pattern can only be called by another
// (i.e. it's an entry point in execution)
localContent.append("List<Object> ").append(getParameterListName(parameter)).append(" = null;").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$
localContent.append("//this pattern can only be called by another (i.e. it's not an entry point in execution)").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
return;
}
localContent.append("paramDesc = new IQuery.ParameterDescription(\"").append(parameter.getName()).append("\", \"").append(parameter.getType()).append("\");").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
localContent.append("queryCtx = new HashMap<String, String>();").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$
if (query.getQueryContext() != null) {
for (String key : query.getQueryContext().keySet()) {
localContent.append("queryCtx.put(\"").append(key).append("\", \"").append(query.getQueryContext().get(key)).append("\");").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
localContent.append("List<Object> ").append(getParameterListName(parameter)).append(" = "); //$NON-NLS-1$ //$NON-NLS-2$
localContent.append("QueryHelper.load(ctx, \"").append(query.getExtensionId()).append("\").execute(paramDesc, queryCtx, ctx);").append(EGFCommonConstants.LINE_SEPARATOR); //$NON-NLS-1$ //$NON-NLS-2$
}
@Override
protected void addVariableInitialization() throws PatternException {
content.append("<%").append(START_INIT_VARIABLE_MARKER).append("%>"); //$NON-NLS-1$ //$NON-NLS-2$
content.append(contentHelper.getMethodContent(pattern.getInitMethod()));
content.append("<%").append(END_INIT_VARIABLE_MARKER).append("%>"); //$NON-NLS-1$ //$NON-NLS-2$
}
public static final String START_METHOD_DECLARATION_MARKER = "//Start of methods"; //$NON-NLS-1$
public static final String END_METHOD_DECLARATION_MARKER = "//End of methods"; //$NON-NLS-1$
public static final String START_LOOP_MARKER = "//Start of work"; //$NON-NLS-1$
public static final String END_LOOP_MARKER = "//End of work"; //$NON-NLS-1$
public static final String START_INIT_VARIABLE_MARKER = "//Start of init"; //$NON-NLS-1$
public static final String END_INIT_VARIABLE_MARKER = "//End of init"; //$NON-NLS-1$
public static final String CONSTRUCTOR_MARKER = "//Here is the constructor"; //$NON-NLS-1$
}