#!/bin/bash
## 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.

# Parser builder

GRAMMAR="${GRAMMAR:-main.jj}"

# --------------------------------------------------------

function grammar
{
    FILE="$1"
    PKG="$2"
    CLASS="$3"

##     NAME="$(echo $N | tr '[:lower:]' '[:upper:]')"
##     DIR1="$(echo $N | tr '[:upper:]' '[:lower:]')"
    
    DIR="../src/main/java/org/apache/jena/sparql/lang/$PKG"

    (cd "$DIR" ; rm -f TokenMgrError.java ParseException.java Token.java JavaCharStream.java )

    echo "---- Process grammar -- $1"
    javacc -OUTPUT_DIRECTORY=$DIR  -JDK_VERSION=1.7 "${FILE}"
    RC=$?

    [ "$RC" = 0 ] || return

##     echo "---- Create HTML"
##     jjdoc -OUTPUT_FILE=${FILE%%.jj}.html "${FILE}"
    echo "---- Create text form"
    jjdoc -TEXT=true -OUTPUT_FILE=${FILE%%.jj}.txt "${FILE}"

  # Fix unnecessary imports
    echo "---- Fixing Java warnings in ${NAME}TokenManager ..."

    F="$DIR/${CLASS}TokenManager.java"

    sed -e 's/@SuppressWarnings."unused".//' \
        -e 's/import .*//' -e 's/MatchLoop: do/do/' \
        -e 's/int hiByte = (int)(curChar/int hiByte = (curChar/' \
	< $F > F
    mv F $F

##     # Java5+ fixups
##     echo "---- Fixing Java warnings in JavaCharStream ..."
##     # Deprecated:
##     #   public int getColumn()
##     #   public int getLine()
##     F="$DIR/JavaCharStream.java"
##     if [ -e "$F" ]
## 	then
## 	sed -e 's/@Deprecated //' \
## 	    -e 's/public int getColumn/@Deprecated public int getColumn/' \
## 	    -e 's/public int getLine/@Deprecated public int getLine/' < $F > F
## 	mv F $F
##     fi
## 

##     echo "---- Fixing Java warnings in ParseException ..."
##     #Override:
##     #   public String getMessage()
##     F="$DIR/ParseException.java"
##     sed -e 's/@Override //' \
## 	-e 's/public String getMessage/@Override public String getMessage/' < $F > F
##     mv F $F

    echo "---- Fixing Java warnings in Token ..."
    F="$DIR/Token.java"
    sed -e 's/@Override //' \
	-e 's/public String toString/@Override public String toString/' < $F > F
    mv F $F


    echo "---- Fixing Java warnings in TokenMgrError ..."
    # Override:
    #   public String getMessage()
    F="$DIR/TokenMgrError.java"
    sed -e 's/@Override //' \
	-e 's/public String getMessage/@Override public String getMessage/' < $F > F
    mv F $F

    echo "---- Fixing Java warnings in ${CLASS} ..."
    F="$DIR/${CLASS}.java"
    sed -e 's/public class /\n@SuppressWarnings("all")\npublic class /' < $F > F 
##     sed -e 's/for (java.util.Iterator/for (java.util.Iterator<int[]>/' \
## 	-e 's/(int\[\])//' < $F > F
    mv F $F

    echo "---- Done"
}

# --------------------------------------------------------

if [ $# == 0 ]
then
    # Not sparql10
    set -- sparql11 arq
    ## echo "Usage: grammar [arq|sparql]" 1>&2
    ## exit 1
    fi

for G in "$@"
do
  case "$G" in
      sparql10|sparql_10.jj)
    
          # SPARQL 1.0 - use a static copy.
          # The parser that is exactly the working group grammar.
##           #### cat "$GRAMMAR" | cpp -P -DSPARQL -DSPARQL_10 > sparql_10.jj
##           grammar sparql_10.jj sparql_10 SPARQLParser10
##           ;;
         echo "SPARQL 1.0 - not rebuilt"
          ;;

      sparql11|sparql_11.jj)
	  # License header.  cpp is run to exclude comments from \$GRAMMAR
	  # because thay picks up unwanted material as well as the comments
	  # in $GRAMMAR
	  cp header.jj sparql_11.jj
          # The parser that is exactly the working group grammar.
          cat "$GRAMMAR" | cpp -P -DSPARQL -DSPARQL_11 >> sparql_11.jj
          grammar sparql_11.jj sparql_11 SPARQLParser11
          ;;

      arq|arq.jj)
	  cp header.jj arq.jj
          cat "$GRAMMAR" | cpp -P -DARQ - >> arq.jj
          grammar arq.jj arq ARQParser
          ;;

      all)  grammar sparql
            grammar arq
	    # rdqlGrammar
	    ;;
      *)    echo "**** Unknown grammar: $G" 1>&2
            ;;
    esac
done
