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

ME="$(readlink -f "$0")"
ROOT="$(readlink -f "$(dirname "$ME")/../..")"

find "$ROOT" -name pom.xml -not -path '*/target/*' | while read pom; do
	rel="$(xpath -q -e '/project/parent/relativePath/text()' "$pom")"
	[ -z "$rel" ] && continue;
	abs="$(readlink -f "$(dirname "$pom")/${rel%/pom.xml}")"
	# check if we can find the parent pom
	[ -d "$abs" ] && [ -r "$abs/pom.xml" ] \
		|| { echo "Could not resolve relativePath to parent-pom in $pom: $rel resolves to $abs"; continue; }
	# check if it's the right parent
        p_aid="$(xpath -q -e '/project/parent/artifactId/text()' "$pom")"
        r_aid="$(xpath -q -e '/project/artifactId/text()' "$abs/pom.xml")"
        [ "$p_aid" = "$r_aid" ] \
		|| { echo "Wrong parent-pom referenced in $pom: expected $p_aid but found $r_aid"; continue; }

	#echo "$pom: OK"
done
