/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.olingo.server.core.uri.parser;

import org.apache.olingo.commons.api.edm.EdmType;
import org.apache.olingo.server.core.uri.UriInfoImpl;
import org.apache.olingo.server.core.uri.parser.UriParseTreeVisitor.TypeInformation;
import org.apache.olingo.server.core.uri.queryoption.ExpandItemImpl;
import org.apache.olingo.server.core.uri.queryoption.SelectItemImpl;

import java.util.Stack;

/**
 * UriContext object used for holding information for URI parsing.
 *
 */
public class UriContext {

  public static class LambdaVariables {
    public boolean isCollection;
    public String name;
    public EdmType type;
  }

  /**
   * Hold all currently allowed lambda variables
   * As lambda functions can be nested there may be more than one allowed lambda variables at a time while parsing a
   * $filter or $orderby expressions.
   */
  public Stack<LambdaVariables> allowedLambdaVariables;
  /**
   * Used to stack type information for nested $expand, $filter query options and other cases.
   */
  public Stack<TypeInformation> contextTypes;

  // CHECKSTYLE:OFF (Maven checkstyle)
  /**
   * Set within method
   * {@link org.apache.olingo.server.core.uri.antlr.UriParserBaseVisitor#visitExpandItem(
   * org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandItemContext ctx)}
   * and {@link
   * org.apache.olingo.server.core.uri.antlr.UriParserBaseVisitor#visitExpandPathExtension(
   * org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandPathExtensionContext ctx)} to allow nodes
   * deeper in the expand tree at
   * {@link org.apache.olingo.server.core.uri.antlr.UriParserBaseVisitor#visitExpandPathExtension(
   * org.apache.olingo.server.core.uri.antlr.UriParserParser.ExpandPathExtensionContext ctx)}
   * appending path
   * segments to the currently processed {@link ExpandItemImpl}.
   */
  public ExpandItemImpl contextExpandItemPath;
  // CHECKSTYLE:ON (Maven checkstyle)

  /**
   * Set within method
   * {@link org.apache.olingo.server.core.uri.antlr.UriParserBaseVisitor#visitSelectItem(
   * org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectItemContext ctx)} to allow
   * nodes
   * deeper in the expand tree at
   * {@link org.apache.olingo.server.core.uri.antlr.UriParserBaseVisitor#visitSelectSegment(
   * org.apache.olingo.server.core.uri.antlr.UriParserParser.SelectSegmentContext ctx)}
   * appending path segments to the
   * currently processed {@link SelectItemImpl}.
   */
  public SelectItemImpl contextSelectItem;
  /**
   * Stores the currently processed UriInfo objects. There is one URI Info object for the resource path
   * and one for each new first member access within $filter and $orderBy options.
   */
  public UriInfoImpl contextUriInfo;
  public boolean contextReadingFunctionParameters;

  public UriContext() {

    contextExpandItemPath = null;
    contextReadingFunctionParameters = false;
    contextSelectItem = null;
    contextTypes = new Stack<UriParseTreeVisitor.TypeInformation>();
    allowedLambdaVariables = new Stack<UriContext.LambdaVariables>();

  }
}