#!/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

DIR="../src/main/java/org/apache/jena/riot/lang/extra/javacc"
FILE="turtle.jj"
CLASS=TurtleJavacc

(cd "$DIR" ; rm -f *.java )

javacc -OUTPUT_DIRECTORY=$DIR -JDK_VERSION=1.8 "$FILE"

RC=$?
[ "$RC" = 0 ] || exit $RC

# Fix unnecessary imports
echo "---- Fixing Java warnings in ${CLASS}TokenManager ..."
F="$DIR/${CLASS}TokenManager.java"

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

## 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/for (java.util.Iterator/for (java.util.Iterator<int[]>/' \
    -e 's/(int\[\])//' \
    -e 's/^\s*;\s*$//' \
    < $F > F
mv F $F

echo "---- Done"
