#!/bin/sh ######################################################################### # # FILE : verifyJavaSource # DATE : 14.10.2002 # AUTHOR : Patrick Meier / patrick.meier@gmx.net # DESCRIPTION : verify java sources # # Copyrigth (C) 2002 by Patrick Meier, Switzerland # ######################################################################### PN=`basename "$0"` USERFULLNAME="Patrick Meier" PROJECT="jpTools" BLOCK_INDENT=" " CR="\n" VERSION_STRING="public static final String VERSION" LOGGER_STRING1="private static Logger log =" LOGGER_STRING2="private static transient Logger log =" LOGGER_INSTANCE="Logger.getLogger( classname.class );" RCSFILE="\$RCSfile: \$" GREP="/bin/grep" IDENT=" -" ######################################################################### # Usage ######################################################################### Usage() { echo "$PN - verify java source" echo "usage: $PN [[--gpl] [--file1] [filename]] | [[--static|--todo] [file1 file2...]]" echo " --file create a new file" echo " --header get file header" echo " --footer get file footer" echo " --gpl use gpl licence model for header, footer or file" echo "" echo " --static searchs static blocks in the source code" echo " --todo searchs todo statements in the source code" echo " " echo "If no file is added to the command line then the script searches all java files from current directory." echo "The script verifies some file entries:" echo ">each file should have a version string like:" echo "$VERSION_STRING = \"\$Revision: \$\";" echo "" echo ">each class should have a description like: " printf "$CLASS_DESCRIPTION${CR}" echo ">if a logger is defined, than it controls the definition" echo "$LOGGER_STRING1 $LOGGER_INSTANCE" echo " or " echo "$LOGGER_STRING2 $LOGGER_INSTANCE" echo "" echo ">each file should have a header like:" printf "$FILEHEADER" echo "" echo ">each file should have a footer like:" printf "$FILEFOOTER" exit 1 } ######################################################################### # getClassFileHeader ######################################################################### getClassFileHeader() { gpl="$LICENCE" currentUser="$USERFULLNAME" if [ -n "$1" ] then fileName="$1".java else fileName="$RCSFILE" fi library="$PROJECT" FILEHEADER="/******************************************************************************${CR}" FILEHEADER="$FILEHEADER * File : ${fileName}${CR}" FILEHEADER="$FILEHEADER * Author : ${currentUser}${CR}" FILEHEADER="$FILEHEADER * Date : `date`${CR}" FILEHEADER="$FILEHEADER * Last change : \$Date: $ / \$Author: \$${CR}" FILEHEADER="$FILEHEADER * Version : \$Revision: \$ ${CR}" FILEHEADER="$FILEHEADER * ${CR}" if [ -n "$gpl" ] then FILEHEADER="$FILEHEADER * Copyright (C) `date +%Y` by ${currentUser}${CR}" FILEHEADER="$FILEHEADER *${CR}" FILEHEADER="$FILEHEADER ****************************************************************************${CR}" if [ -n "$library" ] then FILEHEADER="$FILEHEADER * This file is part of the $library library${CR}" fi else FILEHEADER="$FILEHEADER * >>> For the file history look at the end of the file <<<${CR}" FILEHEADER="$FILEHEADER ******************************************************************************/${CR}" fi if [ -n "$gpl" ] then FILEHEADER="$FILEHEADER *${CR}" FILEHEADER="$FILEHEADER * This library is free software; you can redistribute it and/or${CR}" FILEHEADER="$FILEHEADER * modify it under the terms of the GNU Lesser General Public${CR}" FILEHEADER="$FILEHEADER * License as published by the Free Software Foundation; either${CR}" FILEHEADER="$FILEHEADER * version 2.1 of the License, or (at your option) any later version.${CR}" FILEHEADER="$FILEHEADER *${CR}" FILEHEADER="$FILEHEADER * This library is distributed in the hope that it will be useful,${CR}" FILEHEADER="$FILEHEADER * but WITHOUT ANY WARRANTY; without even the implied warranty of${CR}" FILEHEADER="$FILEHEADER * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU${CR}" FILEHEADER="$FILEHEADER * Lesser General Public License for more details.${CR}" FILEHEADER="$FILEHEADER *${CR}" FILEHEADER="$FILEHEADER * You should have received a copy of the GNU Lesser General Public${CR}" FILEHEADER="$FILEHEADER * License along with this library; if not, write to the Free Software${CR}" FILEHEADER="$FILEHEADER * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA${CR}" FILEHEADER="$FILEHEADER *${CR}" FILEHEADER="$FILEHEADER ****************************************************************************${CR}" FILEHEADER="$FILEHEADER * \$Id\$ ${CR}" FILEHEADER="$FILEHEADER ****************************************************************************${CR}" FILEHEADER="$FILEHEADER */${CR}" fi printf "$FILEHEADER" } ######################################################################### # getClassFileFooter ######################################################################### getClassFileFooter() { gpl="$LICENCE" if [ -n "$gpl" ] then FILEFOOTER="/****************************************************************************/${CR}" FILEFOOTER="$FILEFOOTER/* EOF */${CR}" FILEFOOTER="$FILEFOOTER/****************************************************************************/${CR}" else FILEFOOTER="/******************************************************************************${CR}" FILEFOOTER="$FILEFOOTER * History;${CR}" FILEFOOTER="$FILEFOOTER * \$Log: \$${CR}" FILEFOOTER="$FILEFOOTER * ${CR}" FILEFOOTER="$FILEFOOTER ******************************************************************************/${CR}" fi printf "$FILEFOOTER" } ######################################################################### # getClassFileFooter ######################################################################### getClassDescrition() { CLASS_DESCRIPTION="/**${CR}" CLASS_DESCRIPTION="$CLASS_DESCRIPTION * description.${CR}" CLASS_DESCRIPTION="$CLASS_DESCRIPTION * @author $USERFULLNAME${CR}" CLASS_DESCRIPTION="$CLASS_DESCRIPTION * @version \$Revision: \$${CR}" CLASS_DESCRIPTION="$CLASS_DESCRIPTION */${CR}" printf "$CLASS_DESCRIPTION" } ######################################################################### # search ######################################################################### getClassFile() { CLASSNAME=${1##*.} packageName=${1%.*} logger="$2" toString="$3" FILE="`getClassFileHeader "$CLASSNAME"`${CR}" if [ "$packageName" = "$CLASSNAME" ] then : else FILE="${FILE}package $packageName;${CR}" FILE="${FILE}$BLOCK_INDENT${CR}${CR}" fi if [ -n "$logger" ] then FILE="${FILE}import jptools.logger.Logger;${CR}" else FILE="${FILE}//import${CR}" fi FILE="${FILE}$BLOCK_INDENT${CR}" FILE="${FILE}${CR}`getClassDescrition`${CR}" FILE="${FILE}public class ${CLASSNAME}${CR}{${CR}" FILE="${FILE}$BLOCK_INDENT/** Version-number for version-control */${CR}" FILE="${FILE}$BLOCK_INDENT$VERSION_STRING = \"\$Revision: \$\";${CR}${CR}" if [ -n "$logger" ] then FILE="${FILE}$BLOCK_INDENT/** the logger */${CR}" FILE="${FILE}$BLOCK_INDENT$LOGGER_STRING1 = Logger.getLogger( ${CLASSNAME}.class );${CR}${CR}" fi FILE="${FILE}${BLOCK_INDENT}${CR}" FILE="${FILE}${BLOCK_INDENT}/**${CR}" FILE="${FILE}${BLOCK_INDENT} * Constructor${CR}" FILE="${FILE}${BLOCK_INDENT} */${CR}" FILE="${FILE}${BLOCK_INDENT}public ${CLASSNAME}()${CR}" FILE="${FILE}${BLOCK_INDENT}{${CR}" FILE="${FILE}${BLOCK_INDENT}}${CR}" if [ -n "$toString" ] then FILE="${FILE}${BLOCK_INDENT}${CR}" FILE="${FILE}${BLOCK_INDENT}${CR}" FILE="${FILE}${BLOCK_INDENT}/**${CR}" FILE="${FILE}${BLOCK_INDENT} * This method returns a String representation of the object${CR}" FILE="${FILE}${BLOCK_INDENT} * @return The object as String.${CR}" FILE="${FILE}${BLOCK_INDENT} */${CR}" FILE="${FILE}${BLOCK_INDENT}public String toString()${CR}" FILE="${FILE}${BLOCK_INDENT}{${CR}" FILE="${FILE}${BLOCK_INDENT}${BLOCK_INDENT}return super.toString();${CR}" FILE="${FILE}${BLOCK_INDENT}}${CR}" fi FILE="${FILE}}${CR}" FILE="$FILE${CR}`getClassFileFooter`${CR}" printf "$FILE" } ######################################################################### # search ######################################################################### search() { $GREP "$@" } ######################################################################### # get the value of a java header key ######################################################################### getHeaderTag() { grep -E "(^[ ].*$@[ \t].*:)" $filename | sed "s/ \* //g;s/$@[ ]*: //g" } ######################################################################### # print message ######################################################################### printMessage() { if [ -n "$message" ] then if [ -n "$PRINTFILENAME" ] then : else echo "$@:" PRINTFILENAME="ok" fi printf "$message${CR}" fi } testClassVersion() { message="" if( eval search \"$VERSION_STRING\" $@ >/dev/null 2>&1 ) then : else if( eval search \"VERSION\" $@ >/dev/null 2>&1 ) then message="${IDENT}correct attribute '$VERSION_STRING'" else message="${IDENT}add attribute '$VERSION_STRING'" fi fi printMessage $@ } testLogger() { message="" if( eval search \"Logger\" $@ >/dev/null 2>&1 ) then if( eval search \"$LOGGER_STRING1\" $@ >/dev/null 2>&1 ) then : else if( eval search \"$LOGGER_STRING2\" $@ >/dev/null 2>&1 ) then : else message="${IDENT}define correct logger attribute '$LOGGER_STRING1'" fi fi else : fi printMessage $@ } testFilename() { message="" filename="$@" headerFilename="`getHeaderTag "File" | sed 's/\$RCSfile: //;s/,v \\$//g;s/\$$//g'`" if [ "${filename##*/}" = "$headerFilename" ] then : else if [ -n "$headerFilename" ] then message="${IDENT}the filename is not correct in fileheader: '$headerFilename'!" else message="${IDENT}the filename in the header is empty!" fi fi printMessage $@ } testAuthor() { message="" filename="$@" author="`getHeaderTag "Author"`" if [ -n "$author" ] then if [ "$author" = "author" ] then message="${IDENT}the author name is wrong!" else : fi else message="${IDENT}the author is empty!" fi printMessage $@ } testDate() { message="" filename="$@" date="`getHeaderTag "Date"`" if [ -n "$date" ] then : else message="${IDENT}the date is empty!" fi printMessage $@ } getRCSVersion() { echo "$@" | sed 's/\$Revision: //;s/\$$//g;s/ //g' } testVersion() { message="" filename="$@" version=`getHeaderTag "Version"` version=`getRCSVersion $version` if [ -n "$version" ] then : else message="${IDENT}the file version is empty!" fi printMessage $@ } testLastChange() { message="" filename="$@" date="`getHeaderTag "Last change" | sed 's/$Date: //g;s/ $ \/ $Author://g;s/\$$//g'`" if [ -n "$date" ] then author="`echo $date | awk '{print $3}'`" realDate="`echo $date | awk '{print $1" "$2}'`" if [ -n "$realDate" ] then : else message="${IDENT}the last change field has wrong syntax: date or user is not defined!" fi if [ -n "$author" ] then : else message="${IDENT}the last change field has wrong syntax: date or user is not defined!" fi else message="${IDENT}the last change is empty!" fi printMessage $@ } testClassDescription() { description="`search -E "(^\/(\*\*))|(^[ \t]\*.*)" $@ | grep -v -E "(^[ ].*File[ \t].*:)|(^[ ].*Author[ \t].*:)|(^[ ].*Date[ \t].*:)|(^[ ].*Version[ \t].*:)|(^[ ].*Last change[ \t].*:)|(^[\/ ]\*[\*]+)|(^ \* History:)|(^\ \* .*)|(For the file history look at the end of the file)" | grep -E "(^ \* )" | sed 's/ \* //g'`" author="`echo "$description" | grep "@author" | sed 's/@author //'`" version="`echo "$description" | grep "@version" | sed 's/@version //'`" version="`getRCSVersion "$version"`" descbody="`echo "$description" | grep -v -E "@version|@author"`" message="" if [ -n "$version" ] then : else message="${IDENT}the class description version is empty!" fi printMessage $@ message="" if [ -n "$author" ] then if [ "$author" = "author" ] then message="${IDENT}the class author name is wrong!" else : fi else message="${IDENT}the class author empty!" fi printMessage $@ message="" if [ -n "$descbody" ] then : else message="${IDENT}the class descritpion is empty!" fi printMessage $@ } testImports() { message="" imports="`search -E "\/\/[ ]*import" $@ `" if [ -n "$imports" ] then message="${IDENT}control the import statements!" fi printMessage $@ } testStatics() { message="" statics="`search -n -E "static" $@ | grep -v " \*.*" | grep -v -E "(VERSION)|(void main)|(final)|(Logger log)"`" if [ -n "$statics" ] then message="${IDENT}the following static blocks found: ${CR}$statics" fi printMessage $@ } testTODO() { message="" todo="`search -n "TODO:" $@ | sed 's/TODO://g;s/ \* //g;s/ //g'`" if [ -n "$todo" ] then message="${IDENT}TODO: ${CR}$todo" fi printMessage $@ } ######################################################################### # main ######################################################################### ! [ -x "$GREP" ] && echo "==>grep not found" && exit 1 STATICS="false" TODOS="false" LICENCE= while [ $# -gt 0 ] do case "$1" in --gpl) LICENCE="GPL";; --file) shift;getClassFile $@;exit;; --header) shift;getClassFileHeader $@;exit;; --footer) shift;getClassFileFooter $@;exit;; --static) STATICS="true";; --todo) TODOS="true";; --) shift;break;; -h) Usage;; -*) Usage;; *) break;; esac shift done files="$@" if [ -z "$files" ] then if [ -d "src" ] then files="`find src -name *.java`" else files="`find . -name *.java`" fi fi for i in $files do PRINTFILENAME="" testFilename $i testAuthor $i testDate $i testLastChange $i testVersion $i testClassVersion $i testLogger $i testClassDescription $i testImports $i if [ "$STATICS" = "true" ] then testStatics $i fi if [ "$TODOS" = "true" ] then testTODO $i fi done