subver=('4.1.2' '4.2' '4.3' '4.4' '4.5')
ROOTCATALOG=/etc/xml/catalog
CATALOG=/etc/xml/docbook
DOCBOOKDIR=/usr/share/xml/docbook/xml-dtd

catalog_create_empty() {
	local catalog="$1"

	if [ ! -e "${catalog}" ]; then
		# create dir if necessary
		mkdir -p "`dirname "$catalog"`"

		echo "Creating XML Catalog ${catalog}" >&2
		xmlcatalog --noout --create "${catalog}"
		if [ ! -e "${catalog}" ]; then
			echo "Failed creating ${catalog}, aborting" >&2
			return 1
		fi
	fi
	return 0
}

catalog_create() {
	if ! catalog_create_empty "${ROOTCATALOG}"; then
		return 1
	fi

	if ! catalog_create_empty "${CATALOG}"; then
		return 1
	fi
	return 0
}

catalog_add() {
	local _NEW=`echo $1 | sed 's|\(.*\)\-.*|\1|'`

	if ! catalog_create; then
		return 1
	fi

	xmlcatalog --noout --add "public" \
		"-//OASIS//DTD DocBook XML V$_NEW//EN" \
		"http://www.oasis-open.org/docbook/xml/$_NEW/docbookx.dtd" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//DTD DocBook XML CALS Table Model V$_NEW//EN" \
		"file://${DOCBOOKDIR}/calstblx.dtd" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//DTD XML Exchange Table Model 19990315//EN" \
		"file://${DOCBOOKDIR}/soextblx.dtd" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//ELEMENTS DocBook XML Information Pool V$_NEW//EN" \
		"file://${DOCBOOKDIR}/dbpoolx.mod" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//ELEMENTS DocBook XML Document Hierarchy V$_NEW//EN" \
		"file://${DOCBOOKDIR}/dbhierx.mod" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//ELEMENTS DocBook XML HTML Tables V$_NEW//EN" \
		"file://${DOCBOOKDIR}/htmltblx.mod" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//ENTITIES DocBook XML Notations V$_NEW//EN" \
		"file://${DOCBOOKDIR}/dbnotnx.mod" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//ENTITIES DocBook XML Character Entities V$_NEW//EN" \
		"file://${DOCBOOKDIR}/dbcentx.mod" \
		"$CATALOG"
	xmlcatalog --noout --add "public" \
		"-//OASIS//ENTITIES DocBook XML Additional General Entities V$_NEW//EN" \
		"file://${DOCBOOKDIR}/dbgenent.mod" \
		"$CATALOG"
	xmlcatalog --noout --add "rewriteSystem" \
		"http://www.oasis-open.org/docbook/xml/$_NEW" \
		"file://${DOCBOOKDIR}/" \
		"$CATALOG"
	xmlcatalog --noout --add "rewriteURI" \
		"http://www.oasis-open.org/docbook/xml/$_NEW" \
		"file://${DOCBOOKDIR}/" \
		"$CATALOG"

	xmlcatalog --noout --add "delegatePublic" \
		"-//OASIS//ENTITIES DocBook XML" \
		"file://$CATALOG" \
		"$ROOTCATALOG"
	xmlcatalog --noout --add "delegatePublic" \
		"-//OASIS//DTD DocBook XML" \
		"file://$CATALOG" \
		"$ROOTCATALOG"
	xmlcatalog --noout --add "delegateSystem" \
		"http://www.oasis-open.org/docbook/" \
		"file://$CATALOG" \
		"$ROOTCATALOG"
	xmlcatalog --noout --add "delegateURI" \
		"http://www.oasis-open.org/docbook/" \
		"file://$CATALOG" \
		"$ROOTCATALOG"

	local DTDVERSION
	for DTDVERSION in "${subver[@]}"
	do
		xmlcatalog --noout --add "public" \
			"-//OASIS//DTD DocBook XML V$DTDVERSION//EN" \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION/docbookx.dtd" \
			"$CATALOG"
		xmlcatalog --noout --add "rewriteSystem" \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
			"file://${DOCBOOKDIR}" \
			"$CATALOG"
		xmlcatalog --noout --add "rewriteURI" \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
			"file://${DOCBOOKDIR}" \
			"$CATALOG"
		xmlcatalog --noout --add "delegateSystem" \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
			"file://$CATALOG" \
			"$ROOTCATALOG"
		xmlcatalog --noout --add "delegateURI" \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
			"file://$CATALOG" \
			"$ROOTCATALOG"
	done
	return 0
}

catalog_remove() {
	local _OLD=`echo $2 | sed 's|\(.*\)\-.*|\1|'`

	# Recreate the catalogs to avoid creation of a stale/broken catalog
	# while deleting entries on a non existing catalog
	if ! catalog_create; then
		return 1
	fi

	xmlcatalog --noout --del \
		"-//OASIS//DTD DocBook XML V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//DTD DocBook XML CALS Table Model V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//DTD XML Exchange Table Model 19990315//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//ELEMENTS DocBook XML Information Pool V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//ELEMENTS DocBook XML Document Hierarchy V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//ELEMENTS DocBook XML HTML Tables V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//ENTITIES DocBook XML Notations V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//ENTITIES DocBook XML Character Entities V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//ENTITIES DocBook XML Additional General Entities V$_OLD//EN" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"http://www.oasis-open.org/docbook/xml/$_OLD" \
		"$CATALOG"
	xmlcatalog --noout --del \
		"http://www.oasis-open.org/docbook/xml/$_OLD" \
		"$CATALOG"

	xmlcatalog --noout --del \
		"-//OASIS//ENTITIES DocBook XML" \
		"$ROOTCATALOG"
	xmlcatalog --noout --del \
		"-//OASIS//DTD DocBook XML" \
		"$ROOTCATALOG"
	xmlcatalog --noout --del \
		"http://www.oasis-open.org/docbook/" \
		"$ROOTCATALOG"
	xmlcatalog --noout --del \
		"http://www.oasis-open.org/docbook/" \
		"$ROOTCATALOG"

	local DTDVERSION
	for DTDVERSION in "${subver[@]}"
	do
		xmlcatalog --noout --del \
			"-//OASIS//DTD DocBook XML V$DTDVERSION//EN" \
			"$CATALOG"
		xmlcatalog --noout --del \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
			"$CATALOG"
		xmlcatalog --noout --del \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
			"$CATALOG"

		xmlcatalog --noout --del \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
			"$ROOTCATALOG"
		xmlcatalog --noout --del \
			"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
			"$ROOTCATALOG"
	done
}

post_install() {
	echo "Adding docbook catalog..."
	catalog_add "$@"
}

post_upgrade() {
	echo "Upgrading docbook catalog..."
	catalog_remove "$@"
	catalog_add "$@"
}

pre_remove() {
	echo "Removing docbook catalog..."
	rm -rf "$CATALOG" "$ROOTCATALOG"
}

op=$1
shift

$op $*
