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

org.hotrod.config.SQLParameter Maven / Gradle / Ivy

package org.hotrod.config;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hotrod.config.dynamicsql.SQLSegment;
import org.hotrod.exceptions.InvalidConfigurationFileException;
import org.hotrod.exceptions.InvalidIdentifierException;
import org.hotrod.generator.ParameterRenderer;
import org.hotrod.identifiers.Id;
import org.hotrod.runtime.dynamicsql.expressions.DynamicExpression;
import org.hotrod.runtime.dynamicsql.expressions.LiteralExpression;
import org.hotrod.runtime.dynamicsql.expressions.VariableExpression;

public class SQLParameter implements SQLSegment {

  private static final long serialVersionUID = 1L;

  // Constants

  private static final Logger log = LogManager.getLogger(SQLParameter.class);

  private static final String VALID_NAME_PATTERN = "[a-zA-Z][a-zA-Z0-9_]*";

  public static final String PREFIX = "#{";
  public static final String SUFFIX = "}";

  private static enum VariableType {
    PARAMETER_REFERENCE, //
    VARIABLE
  };

  // Properties

  private String name;
  private VariableType type;
  private ParameterTag definition;

  private Id id;

  // Constructor

  // Java Parameter
  public SQLParameter(final String name, final AbstractConfigurationTag tag, final boolean isVariable)
      throws InvalidConfigurationFileException {
    log.debug("init");
    initialize(name, tag, false);
  }

  private void initialize(final String name, final AbstractConfigurationTag tag, final boolean isVariable)
      throws InvalidConfigurationFileException {

    this.name = name;
    this.type = isVariable ? VariableType.VARIABLE : VariableType.PARAMETER_REFERENCE;
    this.definition = null;

    // name

    if (!this.name.matches(VALID_NAME_PATTERN)) {
      throw new InvalidConfigurationFileException(tag, "Invalid parameter name '" + this.name
          + "'. Must start with a letter and " + "continue with letters, digits, and/or underscores.");
    }

    try {
      this.id = Id.fromJavaMember(this.name);
    } catch (InvalidIdentifierException e) {
      String msg = "Invalid parameter name '" + this.name + "': " + e.getMessage();
      throw new InvalidConfigurationFileException(tag, msg);
    }

  }

  public String getErrorMessage(final String paramDefinition, final String tagIdentification,
      final String extraMessage) {
    return "Invalid parameter " + PREFIX + paramDefinition + SUFFIX + " in SQL query on the tag " + tagIdentification
        + (extraMessage == null ? "." : ":\n" + extraMessage);
  }

  // Setters

  public void setDefinition(final ParameterTag definition) {
    this.definition = definition;
  }

  // Getters

  public String getName() {
    return name;
  }

  public Id getId() {
    return id;
  }

  public boolean isVariable() {
    return this.type == VariableType.VARIABLE;
  }

  public boolean isParameterReference() {
    return this.type == VariableType.PARAMETER_REFERENCE;
  }

  public ParameterTag getDefinition() {
    return definition;
  }

  public String getJavaType() {
    return this.definition.getJavaType();
  }

  public String getJdbcType() {
    return this.definition.getJDBCType().getShortTypeName();
  }
  
  public boolean isInternal() {
    return this.getDefinition().isInternal();
  }

  // Behavior

  @Override
  public boolean isEmpty() {
    return false;
  }

  // Rendering

  @Override
  public String renderStatic(final ParameterRenderer parameterRenderer) {
    String r = parameterRenderer.render(this);
    return r;
  }

  @Override
  public String renderXML(final ParameterRenderer parameterRenderer) {
    return parameterRenderer.render(this);
  }

  @Override
  public DynamicExpression getJavaExpression(final ParameterRenderer parameterRenderer) {
    if (this.isVariable()) {
      return new VariableExpression(this.name);
    } else {
      return new LiteralExpression(parameterRenderer.render(this));
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy