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

set -e

: "$0" "$@"
JAVA_HOME=""
JAVA_HOMES="/usr/lib/jvm/java-6-openjdk"
OFBIZ_HOME="/usr/share/ofbiz"
for possible in $JAVA_HOMES; do
	if [ -e "$possible/bin/java" ]; then
		JAVA_HOME="$possible"
		break
	fi
done
if ! [ "$JAVA_HOME" ]; then
	echo "Couldn't find a java."
	echo "Tried $JAVA_HOMES"
	exit 1
fi
JAVA="$JAVA_HOME/bin/java"

munge_conffile() {
	tmp="$1"
	source="$2"
	case "$source" in
		(framework/entity/config/entityengine.xml)
			. /etc/dbconfig-common/ofbiz.conf
			get pg_fieldtype ofbiz/fieldtype/postgres
			xalan \
				-xsl "$OFBIZ_HOME/support/entityengine.xslt" \
				-in "$OFBIZ_HOME/ucf/$source" \
				-param pgfieldtype "'$pg_fieldtype'" \
				-param dbtype "'$dbc_dbtype'" \
				-param dbuser "'$dbc_dbuser'" \
				-param dbpass "'$dbc_dbpass'" \
				-param dbserver "'$dbc_dbserver'" \
				-param dbport "'$dbc_dbport'" \
				-param dbname "'$dbc_dbname'" > $tmp
		;;
		(*)
			echo "Unknown file: $source"
			exit 1
		;;
	esac
}
configure_ofbiz() {
	extra="-readers=seed"
	for file in "/var/lib/ofbiz/import/"*.xml; do
		if [ -e "$file" ]; then
			extra="$extra -file=\"$file\""
		fi
	done
	eval /etc/init.d/ofbiz install $extra
	rm -rf "/var/lib/ofbiz/import"
}
get() {
	var_name="$1"
	debconf_name="$2"
	shift 2
	if db_get "$debconf_name"; then
		if eval ! [ "\"\$$var_name\" = \"\$RET\"" ]; then
			while [ $# -gt 0 ]; do
				eval $1=1
				shift
			done
			eval $var_name=\"\$RET\"
		fi
	else
		echo "Couldn't fetch '$debconf_name' from debconf!"
		exit 1
	fi
}
ofbiz_init_invoke() {
	if [ -x "/etc/init.d/ofbiz" ]; then
		if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
			invoke-rc.d ofbiz $1 || exit $?
		else
			/etc/init.d/ofbiz $1 || exit $?
		fi
	fi
}

. /usr/share/debconf/confmodule
. /usr/share/dbconfig-common/dpkg/postinst
dbc_generate_include=sh:/etc/ofbiz/dbc-debconf.cfg
[ "$1" != "triggered" ] && dbc_go ofbiz "$@"
if [ -e /etc/ofbiz/dbc-debconf.cfg ]; then
	. /etc/ofbiz/dbc-debconf.cfg
fi
if [ -r "/etc/ofbiz/debconf.cfg" ]; then
	eval `sed -n 's/^ofbiz\.admin\.\(port\|key\)=\(.*\)/ofbiz_admin_\1=\2;/p' "/etc/ofbiz/debconf.cfg" `
fi
if [ "$1" = "triggered" ]; then
	run_seed=""
	for trigger in $2; do
		case "$trigger" in
			(ofbiz-install)
				run_seed=1
				;;
		esac
	done
	if [ "z" != "z$run_seed" ]; then
		ofbiz_init_invoke stop
		configure_ofbiz
		dpkg-trigger --no-await ofbiz-start
	fi
	for trigger in $2; do
		case "$trigger" in
			(ofbiz-start)
				ofbiz_init_invoke start
				;;
		esac
	done
	db_stop
	exit 0
fi

case "$1" in
	(configure|reconfigure)
		ofbiz_init_invoke stop
		dpkg-trigger --no-await ofbiz-install
		if [ -z "$2" ]; then
			db_input medium ofbiz/admin-user || true
			get ofbiz_admin_user ofbiz/admin-user
			if [ "z" = "z$ofbiz_admin_user" ]; then
				ofbiz_admin_user="admin"
			fi
			mkdir -p "/var/lib/ofbiz/import/"
			out="/var/lib/ofbiz/import/ofbiz-framework.xml"
			sed "s/@userLoginId@/$ofbiz_admin_user/g" < "$OFBIZ_HOME/framework/resources/templates/AdminUserLoginData.xml" > "$out.new"
			mv "$out.new" "$out"
			if ! getent passwd ofbiz 2>/dev/null >/dev/null; then
				adduser --quiet --group --no-create-home --system --shell /bin/sh --home /var/lib/ofbiz ofbiz
			fi
			if [ -r "/etc/ofbiz/debconf.cfg" ]; then
				chown root:ofbiz "/etc/ofbiz/debconf.cfg"
			fi
			if ! dpkg-statoverride --list "/var/lib/ofbiz" > /dev/null; then
				dpkg-statoverride --update --add ofbiz ofbiz 755 /var/lib/ofbiz
			fi
		fi
	;;
esac
#DEBHELPER#
db_stop
exit

