#!/bin/bash

# Please only modify this file though linux VIM, because there are special char and needs to use ctrl+v and ctrl +M to generate.

BASE=`pwd`
CMPFILES=(lib/uicommon.jar lib/cmp-shared.jar lib/remoteAuthUtility.jar lib/SDK-WebSvc-Common.jar lib/SDK-Interceptors.jar)

function getEarDependencies() {
        if [ $1 = "ecm.ear" ]; then
                echo "JMPDependencies: deployment.cmp.ear,deployment.cems.ear"
        elif [ $1 = "seci.ear" ]; then
                echo "JMPDependencies: deployment.cmp.ear,deployment.cems.ear,deployment.sm.ear"
        else
                echo "DONOTHING"
        fi

}

function fixEarDependencies() {
        earfile=$1
        earname=`basename $earfile`
        METAFILE="META-INF/MANIFEST.MF"
        dependencies=$(getEarDependencies $earname)
        if [ "$dependencies" != "DONOTHING" ]; then
                jar -xf $earfile $METAFILE
                existDeps=`grep 'JMPDependencies' $METAFILE | wc -l`
                if [ $existDeps -eq 0 ]; then
                        echo "will append dependences to $METAFILE"
                        sed -i "/Created-By.*/a $dependencies" $METAFILE
                else
                        echo "will replace dependences to $METAFILE"
                        sed -i "s/JMPDependencies.*/$dependencies/" $METAFILE
                fi
                sed -i 's///g' $METAFILE
                zip -u $earfile $METAFILE
                rm -rf $METAFILE
        else
		echo "Dependence for $earname is correct, do nothing"
	fi
}

function _replaceEarFile() {
        SOURCE=$1
        TARGET=$2
        FILE=$3
	
        sourcesize=`unzip -l $SOURCE | grep " $FILE" | awk '{print \$1}'`
        targetsize=`unzip -l $TARGET | grep " $FILE" | awk '{print \$1}'`
        echo "start to handle $TARGET, and check $FILE"
        echo "SOURCE:$sourcesize, TARGET:$targetsize"
        if [ "$targetsize"x = ""x ]; then
                echo "$FILE does not in $TARGET, no need to replace"
                exit 0
        fi
        if [ $sourcesize -eq $targetsize ]; then
                echo "Source and Target has same $FILE file"
                exit 0
        fi
        if [ ! -f $FILE ]; then
                `jar -xf $SOURCE $FILE`
                echo "extract $FILE from $SOURCE successfully"
        fi

        if [ -f $FILE ]; then
                echo 'Step 1: remove duplicate files'
                duplicatefiles=`unzip -l $TARGET | sort | uniq -c -d | awk '{print \$5}'`
                for duplicate in $duplicatefiles
                do
                        echo "find duplicate file $duplicate, start to delete it"
                        jar -xf $TARGET $duplicate
                        while true; do
                                zip -d $TARGET $duplicate
                                count=`unzip -l $TARGET | grep $duplicate | wc -l`
                                if [ $count -eq 0 ]; then
                                        break
                                fi
                        done
                done
                for duplicate in $duplicatefiles
                do
                        jar -uf $TARGET -C $BASE $duplicate
                        rm -rf $duplicate
                done
                echo 'Step 1: done'

                echo 'Step 2: replace files'
                jar -uf $TARGET -C $BASE $FILE
                if [ $? -eq 0 ]; then
                        echo "replace $FILE to $TARGET successfully"
                else
                        echo "replace $FILE to $TARGET failed"
                fi
                echo 'Step2: done'
        fi
}

function replaceEarFile() {
        for cmpfile in "${CMPFILES[@]}"
        do
                (_replaceEarFile $1 $2 $cmpfile)
        done
	
	echo "always try to fix dependencies"
	(fixEarDependencies $2)

        chown --reference=$1 $2
        chmod --reference=$1 $2
}

function cleanUpFiles() {
        for cmpfile in "${CMPFILES[@]}"
        do
                rm -rf $BASE/$cmpfile
        done
}

if [ $# -eq 2 ]; then
        (replaceEarFile $1 $2)
        (cleanUpFiles)
elif [ $# -eq 1 ] && [ $1 = 'ALL' ]; then
        echo "replace all ear file under /usr/loca/jboss/standalone/deployment"
        SOURCE='/usr/local/jboss/standalone/deployments/00/cmp.ear'

        TARGETS=`find /usr/local/jboss/standalone/ -name '*.ear'`
        for TARGET in $TARGETS
        do
                (replaceEarFile $SOURCE $TARGET)
        done
        (cleanUpFiles)
else
        echo "usage: patchEar.sh [ <source> <target> ] | [ALL]"
fi
