#!/bin/bash
#
#{{IS_NOTE
#
# Authors: Tom M. Yeh
# Contributors:
# Create Date: 2001/3/30 05:46PM
# Purpose: Generate Java classes from properties files
# Description:
#	Execute 'genprop -h' to know how to use.
# History:
#	5/19/2001	Tom M. Yeh, allow to processing non-utf files and specify
#				different paths
#
#}}IS_NOTE
#
# Copyright (C) 2001 Potix Corporation. All Rights Reserved.
#
#{{IS_RIGHT
#	This program is distributed under Lesser GPL Version 2.1 in the hope that
#	it will be useful, but WITHOUT ANY WARRANTY.
#}}IS_RIGHT
#

function showhelp
{
	echo "genprop - generate Java classes from properties files"
	echo "Copyright (C) 2001 Potix Corporation. All Rights Reserved."
	echo
	echo "Usage:"
	echo "  genprop [-f] [-h] [-u] prop_dir dst_dir"
	echo
	echo "prop_dir"
	echo "    The directory holds the properties files, *.properties."
	echo "    If -u is specified, *.properties.utf are expected."
	echo "dst_dir"
	echo "    The destination directory, where the generated java codes"
	echo "    are stored."
	echo
	echo "Example:"
	echo "    genpro src/conf codegen"
	echo
	echo "Options:"
	echo " -f"
	echo "    Force the generation without checking whether it is newer."
	echo " -u"
	echo "    UTF files (with .utf extension) expected."
	echo " -x"
	echo "    Exclude filename that contains '_'."
	echo " -h or --help"
	echo "    Show this message."
	echo
	echo "Format of the properties.utf file:"
	echo "#@=TypeName"
	echo "    and all constants are added with the type name, e.g, MT_SYS."
	echo "    It must be at the first line."
	echo
	echo "#-=M_FILE_NOT_FOUND"
	echo "1002=File Not Found"
	echo "    Other part is composed as pair of lines. The first line of"
	echo "    each pair specifies the constant name (at second column)"
	echo "    The second line of each pair specifies the value (1002 in"
	echo "    the above example). Notice: hexadecimal is assumed, only"
	echo "    lower-case with four digits is allowed, and starts at 1000."
	echo
	echo " * 
	echo " * You have to maintain org.zkoss.mesg.MessageConst.java"
	echo "   consistently, if you add a new properties file."
	echo " * Lines starting with # or being empty are ignored."
}

#-- check options
if [ "$1" = "--help" ] ; then
	showhelp
	exit 0
fi

awkpath=$0
force=0
flext=.properties
exclude=N.O.E.X.I.S.T

while getopts "fhux" opt; do
  case $opt in
  h )	showhelp
		exit 0;;
  f )	force=1;;
  u )	flext=.properties.utf;;
  x )	exclude=_;;
  \? )	echo "Try 'genprop --help' for more information"
		exit 1;;
  esac
done
shift $(($OPTIND - 1))

if [ $# != 2 ] ; then
	echo "genprop: wrong number of arguments"
	echo "Try 'genprop --help' for more information"
	exit 1
fi

cnfpath=$1
codegendir=$2

#-- check directory structure
if [ ! -d $cnfpath ] ; then
	echo "Error: $cnfpath is not a directory" 1>&2
	exit 1
fi

#-- start process
for fn in $cnfpath/*$flext ; do
	if [ \( -f "$fn" \) -a \( "${fn#*$exclude}" = "$fn" \) ] ; then
		msgnm=${fn##$cnfpath/}
		msgnm=${msgnm%$flext}

		clsnm=$(head -1 $fn)
		clsnm=${clsnm###class=}
		pkgnm=${clsnm%.*}
		clsnm=${clsnm##*.}

		if [ "$clsnm" = "" ] || [ "$pkgnm" == "" ] ; then
			echo The first line of $fn must be "#class=package.class"
			exit 1
		fi

		pkgpath=${codegendir}/${pkgnm//.//}
		dstfn=${pkgpath}/${clsnm}.java

		#update if newer
		if [ \( force = 1 \) -o \( ! -f "$dstfn" \) -o \( "$fn" -nt "$dstfn" \) ] ; then
			echo "Generating $dstfn..."

			if [ "$awkfn" = "" ] ; then
				if [ "$TERM" = "cygwin" ] ; then
					awkpath=$(cygpath -u $awkpath)
				fi
				awkfn=${awkpath%/*}/genprop.awk
			fi

			mkdir -p $pkgpath
			args="-f $awkfn -v pkgnm=$pkgnm -v clsnm=$clsnm -vmsgnm=$msgnm -vusernm=$USER"
			awk $args -v "when=$(date)" "$fn" > "$dstfn"
		fi
	fi
done
