/*
* Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com)
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: EngineTemplateProcessor.java 3918 2008-04-14 17:35:35Z gbevin $
*/
package com.uwyn.rife.engine;
import com.uwyn.rife.engine.exceptions.EngineException;
import com.uwyn.rife.engine.exceptions.SubmissionBeanFormGenerationErrorException;
import com.uwyn.rife.site.FormBuilder;
import com.uwyn.rife.template.BeanHandler;
import com.uwyn.rife.template.Template;
import com.uwyn.rife.template.TemplateEncoder;
import com.uwyn.rife.template.exceptions.TemplateException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
class EngineTemplateProcessor
{
private final ElementContext mContext;
private final Template mTemplate;
private final TemplateEncoder mEncoder;
private Map<String, String[]> mOutputValueMap;
EngineTemplateProcessor(final ElementContext context, final Template template)
{
mContext = context;
mTemplate = template;
mEncoder = template.getEncoder();
}
synchronized List<String> processTemplate()
throws TemplateException, EngineException
{
initialize();
final List<String> set_values = new ArrayList<String>();
EngineTemplateHelper.evaluateExpressionRoleUserTags(mContext, set_values, mTemplate, null);
processExitFlowTags(set_values);
processSubmissionFlowTags(set_values);
processPropertyTags(set_values);
processInputValues(set_values);
processOutputValues(set_values);
processGlobalVariableValues(set_values);
processIncookieValues(set_values);
processOutcookieValues(set_values);
processApplicationTags(set_values);
processSubmissionParametersAndBeans(set_values);
processEmbeddedElementsLate(set_values);
return set_values;
}
private void initialize()
{
// pre-obtain the output entries, since they process the outjection logic
mOutputValueMap = mContext.getOutputs().aggregateValues();
}
private void processExitFlowTags(final List<String> setValues)
{
setValues.addAll(new FlowLinkFlowTagsProcessor(mContext, mOutputValueMap, mTemplate, null, null).processTags());
}
private void processSubmissionFlowTags(final List<String> setValues)
{
setValues.addAll(new SubmissionFlowTagsProcessor(mContext, mOutputValueMap, mTemplate, null, null).processTags());
}
private void processPropertyTags(final List<String> setValues)
{
if (mTemplate.hasFilteredValues(ElementContext.TAG_PROPERTY))
{
String property_value_id = null;
String property_value = null;
for (String[] property_tag : mTemplate.getFilteredValues(ElementContext.TAG_PROPERTY))
{
property_value_id = ElementContext.PREFIX_PROPERTY + property_tag[1];
if (mTemplate.hasValueId(property_value_id) &&
!mTemplate.isValueSet(property_value_id))
{
property_value = mContext.getElementInfo().getPropertyString(property_tag[1]);
if (property_value != null)
{
mTemplate.setValue(property_value_id, mEncoder.encode(property_value));
setValues.add(property_value_id);
}
}
}
}
}
private void processInputValues(final List<String> setValues)
{
String input_value_id = null;
String[] input_values = null;
ElementExecutionState element_state = mContext.getElementState();
for (Map.Entry<String, String[]> input_entry : element_state.getInputEntries())
{
if (mContext.getElementInfo().containsInput(input_entry.getKey()) &&
element_state.hasInputValue(input_entry.getKey()))
{
input_value_id = ElementContext.PREFIX_INPUT + input_entry.getKey();
input_values = input_entry.getValue();
if (mTemplate.hasValueId(input_value_id) &&
!mTemplate.isValueSet(input_value_id))
{
mTemplate.setValue(input_value_id, mEncoder.encode(input_values[0]));
setValues.add(input_value_id);
}
setValues.addAll(EngineTemplateHelper.selectInputParameter(mTemplate, input_entry.getKey(), input_values));
}
}
}
private void processOutputValues(final List<String> setValues)
{
String output_value_id = null;
for (Map.Entry<String, String[]> output_entry : mOutputValueMap.entrySet())
{
if (output_entry.getValue() != null)
{
output_value_id = ElementContext.PREFIX_OUTPUT + output_entry.getKey();
if (mTemplate.hasValueId(output_value_id) &&
!mTemplate.isValueSet(output_value_id))
{
mTemplate.setValue(output_value_id, mEncoder.encode(output_entry.getValue()[0]));
setValues.add(output_value_id);
}
setValues.addAll(EngineTemplateHelper.selectOutputParameter(mTemplate, output_entry.getKey(), output_entry.getValue()));
}
}
}
private void processGlobalVariableValues(final List<String> setValues)
{
String input_value_id;
String output_value_id;
ElementExecutionState element_state = mContext.getElementState();
for (String globalvar_name : mContext.getElementInfo().getGlobalVarNames())
{
if(element_state.hasInputValue(globalvar_name))
{
input_value_id = ElementContext.PREFIX_INPUT + globalvar_name;
if (mTemplate.hasValueId(input_value_id) &&
!mTemplate.isValueSet(input_value_id))
{
mTemplate.setValue(input_value_id, mEncoder.encode(element_state.getInput(globalvar_name)));
setValues.add(input_value_id);
}
setValues.addAll(EngineTemplateHelper.selectInputParameter(mTemplate, globalvar_name, element_state.getInputValues(globalvar_name)));
}
String[] global_output_value = mOutputValueMap.get(globalvar_name);
if (global_output_value != null)
{
output_value_id = ElementContext.PREFIX_OUTPUT + globalvar_name;
if (mTemplate.hasValueId(output_value_id) &&
!mTemplate.isValueSet(output_value_id))
{
mTemplate.setValue(output_value_id, mEncoder.encode(global_output_value[0]));
setValues.add(output_value_id);
}
setValues.addAll(EngineTemplateHelper.selectOutputParameter(mTemplate, globalvar_name, global_output_value));
}
}
}
private void processOutcookieValues(final List<String> setValues)
{
String outcookie_value_id = null;
for (Map.Entry<String, String> outcookie_entry : mContext.getOutcookies().aggregateValues().entrySet())
{
if (mContext.getElementInfo().containsOutcookiePossibility(outcookie_entry.getKey()))
{
outcookie_value_id = ElementContext.PREFIX_OUTCOOKIE + outcookie_entry.getKey();
if (mTemplate.hasValueId(outcookie_value_id) &&
!mTemplate.isValueSet(outcookie_value_id))
{
mTemplate.setValue(outcookie_value_id, mEncoder.encode(outcookie_entry.getValue()));
setValues.add(outcookie_value_id);
}
}
}
}
private void processIncookieValues(final List<String> setValues)
{
String incookie_value_id = null;
for (Map.Entry<String, String> incookie_entry : mContext.getIncookieEntries())
{
if (mContext.getElementInfo().containsIncookie(incookie_entry.getKey()) ||
mContext.getElementInfo().containsGlobalCookie(incookie_entry.getKey()))
{
incookie_value_id = ElementContext.PREFIX_INCOOKIE + incookie_entry.getKey();
if (mTemplate.hasValueId(incookie_value_id) &&
!mTemplate.isValueSet(incookie_value_id))
{
mTemplate.setValue(incookie_value_id, mEncoder.encode(incookie_entry.getValue()));
setValues.add(incookie_value_id);
}
}
}
}
private void processApplicationTags(final List<String> setValues)
{
// set the webapp root
if (mTemplate.hasValueId(ElementContext.ID_WEBAPP_ROOTURL) &&
!mTemplate.isValueSet(ElementContext.ID_WEBAPP_ROOTURL))
{
mTemplate.setValue(ElementContext.ID_WEBAPP_ROOTURL, mContext.getRequestState().getWebappRootUrl(-1));
setValues.add(ElementContext.ID_WEBAPP_ROOTURL);
}
// set the server root
if (mTemplate.hasValueId(ElementContext.ID_SERVER_ROOTURL) &&
!mTemplate.isValueSet(ElementContext.ID_SERVER_ROOTURL))
{
mTemplate.setValue(ElementContext.ID_SERVER_ROOTURL, mContext.getRequestState().getServerRootUrl(-1));
setValues.add(ElementContext.ID_SERVER_ROOTURL);
}
}
private void processSubmissionParametersAndBeans(final List<String> setValues)
{
ElementExecutionState element_state = mContext.getElementState();
String[] submission_param_values = null;
String submission_param_value_id = null;
for (Submission submission : mContext.getElementInfo().getSubmissions())
{
// create the parameters
for (String submission_param_name : submission.getParameterNames())
{
if (element_state.hasRequestParameterValue(submission_param_name))
{
submission_param_values = element_state.getRequestParameterValues(submission_param_name);
submission_param_value_id = ElementContext.PREFIX_PARAM +submission_param_name;
if (mTemplate.hasValueId(submission_param_value_id) &&
!mTemplate.isValueSet(submission_param_value_id))
{
mTemplate.setValue(submission_param_value_id, mEncoder.encode(submission_param_values[0]));
setValues.add(submission_param_value_id);
}
setValues.addAll(EngineTemplateHelper.selectSubmissionParameter(mTemplate, submission_param_name, submission_param_values));
}
}
// create the bean forms
BeanHandler bean_handler = mTemplate.getBeanHandler();
if (bean_handler != null)
{
FormBuilder form_builder = bean_handler.getFormBuilder();
if (form_builder != null)
{
for (BeanDeclaration bean : submission.getBeans())
{
try
{
Map<String, String[]> parameters = null;
if (mContext.hasSubmission() &&
submission.getName().equals(mContext.getSubmission()))
{
parameters = element_state.getRequestParameters();
}
form_builder.generateForm(mTemplate, bean.getBeanClass(), parameters, bean.getPrefix());
}
catch (Throwable e)
{
throw new SubmissionBeanFormGenerationErrorException(mTemplate, mContext.getElementInfo().getDeclarationName(), submission.getName(), bean.getClassname(), e);
}
}
}
}
}
}
private void processEmbeddedElementsLate(final List<String> setValues)
{
// process the embedded elements
if (mTemplate.hasFilteredValues(ElementContext.TAG_ELEMENT))
{
ElementSupport embedding_element = mContext.getElementSupport();
List<String[]> element_tags = mTemplate.getFilteredValues(ElementContext.TAG_ELEMENT);
for (String[] captured_groups : element_tags)
{
// only embed the element if the value hasn't been set in the
// template yet and is declared as late
if (!mTemplate.isValueSet(captured_groups[0]) &&
captured_groups[2].equals("+"))
{
mContext.processEmbeddedElement(captured_groups[0], mTemplate, embedding_element, captured_groups[3], captured_groups[4], null);
setValues.add(captured_groups[0]);
}
}
}
}
}