All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.devonfw.cobigen.impl.model.ContextVariableResolver Maven / Gradle / Ivy

There is a newer version: 2021.12.006
Show newest version
package com.devonfw.cobigen.impl.model;

import java.util.List;
import java.util.Map;

import com.devonfw.cobigen.api.exception.InvalidConfigurationException;
import com.devonfw.cobigen.api.extension.TriggerInterpreter;
import com.devonfw.cobigen.api.to.MatcherTo;
import com.devonfw.cobigen.api.to.VariableAssignmentTo;
import com.devonfw.cobigen.impl.config.entity.Matcher;
import com.devonfw.cobigen.impl.config.entity.Trigger;
import com.devonfw.cobigen.impl.config.entity.VariableAssignment;
import com.devonfw.cobigen.impl.config.entity.Variables;
import com.devonfw.cobigen.impl.exceptions.PluginProcessingException;
import com.devonfw.cobigen.impl.validator.InputValidator;
import com.google.common.collect.Lists;

/**
 * Resolves all context variables for a given input and its trigger
 */
public class ContextVariableResolver {

  /**
   * Input object for which a new object model should be created
   */
  private Object input;

  /**
   * Trigger, which has been activated for the given input
   */
  private Trigger trigger;

  /**
   * Creates a new {@link ModelBuilderImpl} instance for the given properties
   *
   * @param input object for which a new object model should be created
   * @param trigger which has been activated for the given input
   */
  public ContextVariableResolver(Object input, Trigger trigger) {

    if (input == null || trigger == null || trigger.getMatcher() == null) {
      throw new IllegalArgumentException(
          "Cannot create Model from input == null || trigger == null || trigger.getMatcher() == null");
    }
    this.input = input;
    this.trigger = trigger;
  }

  /**
   * Resolves all {@link VariableAssignment}s by using the given {@link TriggerInterpreter}
   *
   * @param triggerInterpreter to be used
   * @return the mapping of variable to value
   * @throws InvalidConfigurationException if there are {@link VariableAssignment}s, which could not be resolved
   */
  public Variables resolveVariables(TriggerInterpreter triggerInterpreter) throws InvalidConfigurationException {

    return resolveVariables(triggerInterpreter, null);
  }

  /**
   * Resolves all {@link VariableAssignment}s by using the given {@link TriggerInterpreter}
   *
   * @param triggerInterpreter to be used
   * @param parent the parent {@link Variables} to inherit.
   * @return the mapping of variable to value
   * @throws InvalidConfigurationException if there are {@link VariableAssignment}s, which could not be resolved
   */
  public Variables resolveVariables(TriggerInterpreter triggerInterpreter, Variables parent)
      throws InvalidConfigurationException {

    Variables variables = new Variables(parent);
    for (Matcher m : this.trigger.getMatcher()) {
      MatcherTo matcherTo = new MatcherTo(m.getType(), m.getValue(), this.input);
      if (triggerInterpreter.getMatcher().matches(matcherTo)) {
        Map resolvedVariables;
        try {
          resolvedVariables = triggerInterpreter.getMatcher().resolveVariables(matcherTo, getVariableAssignments(m));
        } catch (InvalidConfigurationException e) {
          throw e;
        } catch (Throwable e) {
          throw new PluginProcessingException(e);
        }
        InputValidator.validateResolvedVariables(resolvedVariables);
        variables.putAll(resolvedVariables);
      }
    }
    return variables;
  }

  /**
   * Retrieves all {@link VariableAssignment}s from the given {@link Matcher} and converts them into transfer objects
   *
   * @param m {@link Matcher} to retrieve the {@link VariableAssignment}s from
   * @return a {@link List} of {@link VariableAssignmentTo}s
   * @author mbrunnli (08.04.2014)
   */
  private List getVariableAssignments(Matcher m) {

    List variableAssignments = Lists.newLinkedList();
    for (VariableAssignment va : m.getVariableAssignments()) {
      variableAssignments.add(new VariableAssignmentTo(va.getType(), va.getVarName(), va.getValue()));
    }
    return variableAssignments;
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy