#!/bin/sh
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
#
# Copyright (c) 2008 Sun Microsystems, Inc. All Rights Reserved.
#
# The contents of this file are subject to the terms
# of the Common Development and Distribution License
# (the License). You may not use this file except in
# compliance with the License.
#
# You can obtain a copy of the License at
# https://opensso.dev.java.net/public/CDDLv1.0.html or
# opensso/legal/CDDLv1.0.txt
# See the License for the specific language governing
# permission and limitations under the License.
#
# When distributing Covered Code, include this CDDL
# Header Notice in each file and include the License file
# at opensso/legal/CDDLv1.0.txt.
# If applicable, add the following below the CDDL Header,
# with the fields enclosed by brackets [] replaced by
# your own identifying information:
# "Portions Copyrighted [year] [name of copyright owner]"
#
# $Id: amtune-ws7,v 1.5 2008/08/19 19:08:33 veiming Exp $
#

#-------------------------------------------------------------------------------
# Description   :   Delete one or more jvm option(s)
#-------------------------------------------------------------------------------
deleteJVMOptionUsingWSAdmin() {
    jvmOptionString=$1
    flag=$2

    if [ "$jvmOptionString" = "<No value set>" ] ||
                [ "$jvmOptionString" = "" ] ||
                [ "$jvmOptionString" = "<Empty value>" ]; then
        return
    fi
        $ECHO
        $ECHO `$gettext "Deleting JVM Option : "` "$jvmOptionString"

        #$ECHO $WSADMIN delete-jvm-options $WSADMIN_COMMON_PARAMS $jvmOptionString

        if [ "$flag" = "combined" ]; then
            $WSADMIN delete-jvm-options $WSADMIN_COMMON_PARAMS -- "$jvmOptionString"
        else
            $WSADMIN delete-jvm-options $WSADMIN_COMMON_PARAMS -- $jvmOptionString
        fi

        $ECHO $error_message
}

#-------------------------------------------------------------------------------
# Description   :   Create one or more jvm option(s)
#-------------------------------------------------------------------------------
insertJVMOptionUsingWSAdmin() {
    jvmOptionString=$1
    flag=$2

    if [ "$jvmOptionString" != "" ]; then
        $ECHO
        $ECHO `$gettext "Inserting JVM Option : "` "$jvmOptionString"

        #$ECHO $WSADMIN create-jvm-options $WSADMIN_COMMON_PARAMS $jvmOptionString
        if [ "$flag" = "combined" ]; then
             $WSADMIN create-jvm-options $WSADMIN_COMMON_PARAMS -- "$jvmOptionString"
        else
             $WSADMIN create-jvm-options $WSADMIN_COMMON_PARAMS -- $jvmOptionString
        fi
    fi

}

#-------------------------------------------------------------------------------
# Description   :   This function is used to return a value of parameters in thread-pool
#                   http listener, and jvm
#-------------------------------------------------------------------------------
getServerProp() {
    serverPropString=$1
    propName=$2
   
    if [ "$serverPropString" = "" ] || [ "$propName" = "" ]; then
        return  
    fi

    get_token_in_line "$serverPropString" "$propName" "$propName" "nvp" "stream" 
}

#-------------------------------------------------------------------------------
# Description   :   Search and return a specific jvm option in a string that was
#                   generated by web server admin list-jvm-otions command 
#-------------------------------------------------------------------------------
getWSJVMOption() {
    option_key=$1
    option_type=$2
    field_separator=$3
    nvp_separator=$4

    if [ "$option_string" = "" ]; then
        return
    fi

    get_token_in_line "$option_string" "$option_key" "$option_key" "$option_type" "stream" "$field_separator" "$nvp_separator"
}

#-------------------------------------------------------------------------------
# Description   :   Concatenate to the main string if input string is not empty,
#                   not equal to <No value set> nor <Empty value> string
#-------------------------------------------------------------------------------
createParamString() {
    paramString=$1
    inputString=$2

    if [ "$inputString" != "<No value set>" ] &&
       [ "$inputString" != "" ] &&
       [ "$inputString" != "<Empty value>" ]; then
        if [ "$paramString" = "" ]; then
            paramString=$inputString
        else
            paramString="$paramString $inputString"
        fi
    fi
    $ECHO $paramString
}

#-------------------------------------------------------------------------------
# Description   :   Main function that executes web server administration command
#                   "wadm" to modify web server configuration
#-------------------------------------------------------------------------------
tuneServerXML() {
    tune_file="$CONTAINER_INSTANCE_DIR/config/server.xml"

    $ECHO $LINE_SEP
    $ECHO `$gettext "Tuning Web Server Instance..."`
    $ECHO
    $ECHO `$gettext "File                 : "` "$tune_file" `$gettext "(using wadm command line tool)"`
    $ECHO `$gettext "Parameter tuning     :"`
    $ECHO

    threadpool_string=`$WSADMIN get-thread-pool-prop $WSADMIN_COMMON_PARAMS`

    wsadmin_min_threads=`getServerProp "$threadpool_string" "min-threads"` 

    $ECHO `$gettext "1.   Minimum Threads"`
    $ECHO `$gettext "Current Value        : "` "min-threads=$wsadmin_min_threads"
    $ECHO `$gettext "Recommended Value    : "` "min-threads=$AMTUNE_NUM_WS_MIN_THREADS"
    $ECHO
    
    wsadmin_max_threads=`getServerProp "$threadpool_string" "max-threads"` 

    $ECHO `$gettext "2.   Maximum Threads"`
    $ECHO `$gettext "Current Value        : "` "max-threads=$wsadmin_max_threads"
    $ECHO `$gettext "Recommended Value    : "` "max-threads=$numOfMaxThreadPool"
    $ECHO

    wsadmin_queue_size=`getServerProp "$threadpool_string" "queue-size"`

    $ECHO `$gettext "3.   Queue Size"`
    $ECHO `$gettext "Current Value        : "` "queue-size=$wsadmin_queue_size"
    $ECHO `$gettext "Recommended Value    : "` "queue-size=$AMTUNE_NUM_TCP_CONN_SIZE"
    $ECHO

    wsadmin_native_stack_size=`getServerProp "$threadpool_string" "stack-size"`

    $ECHO `$gettext "4.   Native Stack Size"`
    $ECHO `$gettext "Current Value        : "` "stack-size=$wsadmin_native_stack_size"
    if [ "$JVM64bitAvailable" = "true" ]; then 
        $ECHO `$gettext "Recommended Value    : "` "stack-size=$AMTUNE_NATIVE_STACK_SIZE_64_BIT"
    else
        $ECHO `$gettext "Recommended Value    : "` "Use current value"
    fi
    $ECHO

    httplistener_string=`$WSADMIN get-http-listener-prop $WSADMIN_COMMON_PARAMS --http-listener=$WSADMIN_HTTPLISTENER`
    wsadmin_acceptor_threads=`getServerProp "$httplistener_string" "acceptor-threads"`

    $ECHO `$gettext "5.   Acceptor Threads"`
    $ECHO `$gettext "Current Value        : "` "acceptor-threads=$wsadmin_acceptor_threads"
    $ECHO `$gettext "Recommended Value    : "` "acceptor-threads=$acceptorThreads"
    $ECHO

    stat_prop_string=`$WSADMIN get-stats-prop $WSADMIN_COMMON_PARAMS`
    wsadmin_stat_prop=`getServerProp "$stat_prop_string" "enabled"`

    $ECHO `$gettext "6.   Statistic"`
    $ECHO `$gettext "Current Value        : "` "enabled=$wsadmin_stat_prop"
    $ECHO `$gettext "Recommended Value    : "` "enabled=$AMTUNE_STATISTIC_ENABLED"
    $ECHO

    jvm_string=`$WSADMIN get-jvm-prop $WSADMIN_COMMON_PARAMS`
    wsadmin_native_libpath_prefix=`getServerProp "$jvm_string" "native-library-path-prefix"` 

    $ECHO `$gettext "7.   nativelibrarypathprefix"`
    $ECHO `$gettext "Current Value        : "` "nativelibrarypathprefix=$wsadmin_native_libpath_prefix"
    $ECHO `$gettext "Recommended Value    : "` `$gettext "Append "` "/usr/lib/lwp to nativelibrarypathprefix (if Solaris 8)"
    $ECHO

    option_string=`$WSADMIN list-jvm-options $WSADMIN_COMMON_PARAMS`

    wsadmin_min_heap=`getWSJVMOption '-Xms' 'flag' ' '`
    wsadmin_new_min_heap="-Xms${maxHeapSize}M"

    wsadmin_max_heap=`getWSJVMOption '-Xmx' 'flag' ' '`
    wsadmin_new_max_heap="-Xmx${maxHeapSize}M"

    $ECHO `$gettext "8.   Max and Min Heap Size"`
    $ECHO `$gettext "Current Value        : "` "Min Heap: $wsadmin_min_heap Max Heap: $wsadmin_max_heap"
    if [ "$JVM64bitAvailable" = "true" ] && [ $memToUse -gt $amtuneMaxMemoryToUseInMB ]; then
        displayJVM64bitMessage $wsadmin_new_min_heap $wsadmin_new_max_heap
    else
        $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_min_heap $wsadmin_new_max_heap"
    fi
    $ECHO

    wsadmin_loggc_output=`getWSJVMOption '-Xloggc' 'flag' ' '`
    wsadmin_new_loggc_output="-Xloggc:$CONTAINER_INSTANCE_DIR/logs/gc.log"

    $ECHO `$gettext "9.   LogGC Output"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_loggc_output"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_loggc_output"
    $ECHO

    wsadmin_server_mode=`getWSJVMOption '-server' 'flag' ' '`
    wsadmin_new_server_mode="-server"

    $ECHO `$gettext "10.   JVM in Server mode"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_server_mode"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_server_mode"
    $ECHO

    wsadmin_stack_size=`getWSJVMOption '-Xss' 'flag' ' '`
    if [ "$JVM64bitAvailable" = "true" ]; then 
       wsadmin_new_stack_size="-Xss${AMTUNE_PER_THREAD_STACK_SIZE_IN_KB_64_BIT}k"
    else
       wsadmin_new_stack_size="-Xss${AMTUNE_PER_THREAD_STACK_SIZE_IN_KB}k"
    fi

    $ECHO `$gettext "11.   JVM Stack Size"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_stack_size"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_stack_size"
    $ECHO

    wsadmin_new_size=`getWSJVMOption '-XX:NewSize' 'flag' ' '`
    wsadmin_new_new_size="-XX:NewSize=${maxNewSize}M"

    $ECHO `$gettext "12.  New Size"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_new_size"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_new_size"
    $ECHO

    wsadmin_max_new_size=`getWSJVMOption '-XX:MaxNewSize' 'flag' ' '`
    wsadmin_new_max_new_size="-XX:MaxNewSize=${maxNewSize}M"

    $ECHO `$gettext "13.  Max New Size"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_max_new_size"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_max_new_size"
    $ECHO

    wsadmin_disable_explitcit_gc=`getWSJVMOption '-XX:+DisableExplicitGC' 'flag' ' '`
    wsadmin_new_disable_explitcit_gc="-XX:+DisableExplicitGC"

    $ECHO `$gettext "14.  Disable Explicit GC"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_disable_explitcit_gc"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_disable_explitcit_gc"
    $ECHO

    wsadmin_use_parallel_gc=`getWSJVMOption '-XX:+UseParNewGC' 'flag' ' '`
    wsadmin_new_use_parallel_gc="-XX:+UseParNewGC"

    $ECHO `$gettext "15.  Use New Parallel GC"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_use_parallel_gc"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_use_parallel_gc"
    $ECHO

    wsadmin_print_class_histogram=`getWSJVMOption '-XX:+PrintClassHistogram' 'flag' ' '`
    wsadmin_new_print_class_histogram="-XX:+PrintClassHistogram"

    $ECHO `$gettext "16.  Print Class Histogram"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_print_class_histogram"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_print_class_histogram"
    $ECHO

    wsadmin_print_gc_time_stamps=`getWSJVMOption '-XX:+PrintGCTimeStamps' 'flag' ' '`
    wsadmin_new_print_gc_time_stamps="-XX:+PrintGCTimeStamps"

    $ECHO `$gettext "17.  Print GC Time Stamps"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_print_gc_time_stamps"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_print_gc_time_stamps"
    $ECHO

    wsadmin_override_default_libthread=`getWSJVMOption '-XX:+OverrideDefaultLibthread' 'flag' ' '`
    wsadmin_new_override_default_libthread="-XX:+OverrideDefaultLibthread"

    $ECHO `$gettext "18.  OverrideDefaultLibthread (if Solaris 8)"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_override_default_libthread"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_override_default_libthread"
    $ECHO

    wsadmin_use_con_mark_sweep_gc=`getWSJVMOption '-XX:+UseConcMarkSweepGC' 'flag' ' '`
    wsadmin_new_use_con_mark_sweep_gc="-XX:+UseConcMarkSweepGC"

    $ECHO `$gettext "19.  Enable Concurrent Mark Sweep GC"`
    $ECHO `$gettext "Current Value        : "` "$wsadmin_use_con_mark_sweep_gc"
    $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_use_con_mark_sweep_gc"
    $ECHO

    # Display this JVM Options for Niagara box
    if [ "$HWPLATFORM" = "Sun-Fire-T" ]; then
        wsadmin_parallel_gc_threads=`getWSJVMOption '-XX:ParallelGCThreads' 'flag' ' '`
        wsadmin_new_parallel_gc_threads="-XX:ParallelGCThreads=$gcThreads"

        $ECHO `$gettext "20.  Parallel GC Threads"`
        $ECHO `$gettext "Current Value        : "` "$wsadmin_parallel_gc_threads"
        $ECHO `$gettext "Recommended Value    : "` "$wsadmin_new_parallel_gc_threads"
        $ECHO
    fi
    $ECHO
 
    if [ "$AMTUNE_MODE" = "REVIEW" ]; then
        return
    fi

    # Call backup function in amtune-utils because it does not use backup functions in amutils
    # Configuration file cannot be backup in the same directory because deploy-config will fail
    backupConfigFile $tune_file "/tmp/config-ws7-backup"

    # Start: Performance Related Thread Pool parameters for OpenSSO
    if [ "$JVM64bitAvailable" = "true" ]; then 
        $WSADMIN set-thread-pool-prop $WSADMIN_COMMON_PARAMS min_threads=$AMTUNE_NUM_WS_MIN_THREADS \
                                                                max_threads=$numOfMaxThreadPool \
                                                                queue-size=$AMTUNE_NUM_TCP_CONN_SIZE \
                                                                stack-size=$AMTUNE_NATIVE_STACK_SIZE_64_BIT
    else
        $WSADMIN set-thread-pool-prop $WSADMIN_COMMON_PARAMS min_threads=$AMTUNE_NUM_WS_MIN_THREADS \
                                                                max_threads=$numOfMaxThreadPool \
                                                                queue-size=$AMTUNE_NUM_TCP_CONN_SIZE 
    fi
    # End: Performance Related Thread Pool parameters for OpenSSO


    # Start: Performance Related Http Listener parameters for OpenSSO
    $WSADMIN set-http-listener-prop $WSADMIN_COMMON_PARAMS --http-listener=$WSADMIN_HTTPLISTENER \
                                                                acceptor-threads=$acceptorThreads
    # End: Performance Related Http Listener parameters for OpenSSO

    # Start: Performance Related Statistic parameters for OpenSSO
    if [ "$stat_prop_string" != "$AMTUNE_STATISTIC_ENABLED" ]; then
        $WSADMIN set-stats-prop $WSADMIN_COMMON_PARAMS enabled=$AMTUNE_STATISTIC_ENABLED
    fi
    # End: Performance Related Statistic parameters for OpenSSO

    if [ ! "`/bin/uname -r | grep 8 | wc -m`" -eq "0" ] ; then
        $ECHO  "Solaris 8 " `$gettext "specific changes"`
        $WSADMIN set-jvm-prop $WSADMIN_COMMON_PARAMS native-library-path-prefix=/usr/lib/lwp
    fi

    # Start: Performance Related JVM Options for OpenSSO
    curJvmOptionHeapString=""
    curJvmOptionHeapString=`createParamString "$curJvmOptionHeapString" "$wsadmin_min_heap"`
    curJvmOptionHeapString=`createParamString "$curJvmOptionHeapString" "$wsadmin_max_heap"`
    if [ "$curJvmOptionHeapString" != "" ]; then
       # Delete Min Heap and Max Heap JVM Option : -Xms -Xmx
       deleteJVMOptionUsingWSAdmin "$curJvmOptionHeapString" "combined"
    fi


    curJvmOptionString=""
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_server_mode"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_stack_size"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_loggc_output"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_new_size"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_max_new_size"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_disable_explitcit_gc"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_use_parallel_gc"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_print_class_histogram"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_print_gc_time_stamps"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_override_default_libthread"`
    curJvmOptionString=`createParamString "$curJvmOptionString" "$wsadmin_use_con_mark_sweep_gc"`
    if [ "$curJvmOptionString" != "" ]; then
       # Delete other JVM Options 
       deleteJVMOptionUsingWSAdmin "$curJvmOptionString"
    fi
    # End: Performance Related JVM Options for OpenSSO"

    # Start: Performance Related JVM Options for OpenSSO 
    # Insert Min Heap and Max Heap JVM Option : -Xms -Xmx
    jvm_insert_result1=`insertJVMOptionUsingWSAdmin "$wsadmin_new_min_heap $wsadmin_new_max_heap" "combined"`
    $ECHO "\n$jvm_insert_result1\n"

    newJvmOptionString="$newJvmOptionString $wsadmin_new_server_mode"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_stack_size"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_loggc_output"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_new_size"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_max_new_size"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_disable_explitcit_gc"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_use_parallel_gc"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_print_class_histogram"
    newJvmOptionString="$newJvmOptionString $wsadmin_new_print_gc_time_stamps"
    if [ ! "`/bin/uname -r | grep 8 | wc -m`" -eq "0" ] ; then
       $ECHO  `$gettext "Include "` "Solaris 8 " `$gettext "specific changes"`
       newJvmOptionString="$newJvmOptionString $wsadmin_new_override_default_libthread"
    fi
    newJvmOptionString="$newJvmOptionString $wsadmin_new_use_con_mark_sweep_gc"

    if [ "$HWPLATFORM" = "Sun-Fire-T" ]; then
        newJvmOptionString="$newJvmOptionString $wsadmin_new_parallel_gc_threads"
    fi

    # Insert other JVM Options
    jvm_insert_result2=`insertJVMOptionUsingWSAdmin "$newJvmOptionString"`
    $ECHO "\n$jvm_insert_result2 \n"
    # End: Performance Related JVM Options for OpenSSO

    # If one of the insert operation is successful, execute deploy-config operation
    if [ `$ECHO $jvm_insert_result1 | $GREP -i "successfully" | $WC -l` -eq 1 ] ||
       [ `$ECHO $jvm_insert_result2 | $GREP -i "successfully" | $WC -l` -eq 1 ]; then 
       #$ECHO "Deploying the configuration..."
       $WSADMIN deploy-config $WSADMIN_COMMON_PARAMS_NO_CONFIG $WSADMIN_CONFIG
       $ECHO `$gettext "Server restart.  Please wait...."`
       $WSADMIN restart-instance $WSADMIN_COMMON_PARAMS
    fi

}

#############################################################################
# Start of main program
#############################################################################
SCRIPT_LOCATION=`/usr/bin/dirname $0`
AMTUNE_SCRIPT_RECORD_STRING="AMTUNE_WS7_SCRIPT"
TOOLS_HOME="@TOOLS_HOME@"
TEXTDOMAIN=amtune-ws7
TEXTDOMAINDIR=$TOOLS_HOME/locale
export TEXTDOMAIN
export TEXTDOMAINDIR

# import the environment
if [ -f $SCRIPT_LOCATION/amtune-env ]; then
    if [ ! "$INIT_STATUS" = "INIT_COMPLETE" ]; then
        . $SCRIPT_LOCATION/amtune-env
    fi
fi

$ECHO "$WSADMIN_PASSWORD_SYNTAX$WSADMIN_PASSWORD" > $WSADMIN_PASSFILE

ECHO_MSG "`$gettext 'OpenSSO - Web Server Tuning Script'`"

tuneServerXML   | eval $OUTPUT_TYPE

ECHO_MSG $PARA_SEP
