| #! /usr/bin/env 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. |
| # |
| |
| # This script will generate/regenerate the thrift code for Airavata Server Skeletons, Client Stubs |
| # and Data Model java beans in java, C++, PHP and Python. |
| |
| show_usage() { |
| echo -e "Usage: $0 [--native-thrift] [Language to generate stubs]" |
| echo "" |
| echo "options:" |
| echo -e "\tjava Generate/Update Java Stubs" |
| echo -e "\tphp Generate/Update PHP Stubs" |
| echo -e "\tcpp Generate/Update C++ Stubs" |
| echo -e "\tpython Generate/Update Python Stubs." |
| echo -e "\tall Generate/Update all stubs (Java, PHP, C++, Python)." |
| echo -e "\t-h[elp] Print the usage options of this script" |
| echo -e "\t--native-thrift Use natively installed thrift instead of Docker image" |
| } |
| |
| if [ $# -lt 1 ] |
| then |
| show_usage |
| exit 1 |
| fi |
| |
| if [[ $1 == "-h" ||$1 == "--help" ]] |
| then |
| show_usage |
| exit 0 |
| fi |
| |
| REQUIRED_THRIFT_VERSION='0.9.3' |
| THRIFT_DOCKER_IMAGE='thrift' |
| THRIFT_NATIVE="false" |
| |
| setup() { |
| if [[ $THRIFT_NATIVE == "true" ]]; then |
| if hash thrift &> /dev/null; then |
| THRIFT_EXEC=$(which thrift) |
| else |
| THRIFT_EXEC=/usr/local/bin/thrift |
| fi |
| BASEDIR="" |
| else |
| THRIFT_EXEC="docker run --rm -v $PWD:/data $THRIFT_DOCKER_IMAGE:$REQUIRED_THRIFT_VERSION thrift" |
| BASEDIR="/data/" |
| fi |
| |
| VERSION=$($THRIFT_EXEC -version 2>/dev/null | grep -F "${REQUIRED_THRIFT_VERSION}" | wc -l) |
| if [ "$VERSION" -ne 1 ] ; then |
| echo -e "ERROR:\t Apache Thrift version ${REQUIRED_THRIFT_VERSION} is required." |
| echo -e "It is either not installed or is not in the path" |
| exit 1 |
| fi |
| |
| # Global Constants used across the script |
| AIRAVATA_API_IDL_DIR='airavata-apis' |
| BASE_TARGET_DIR='target' |
| |
| # Thrift files |
| AIRAVATA_API_THRIFT_FILE="${BASEDIR}airavata-apis/airavata_api.thrift" |
| DATAMODEL_THRIFT_FILE="${BASEDIR}data-models/airavata_data_models.thrift" |
| APP_CATALOG_THRIFT_FILE="${BASEDIR}data-models/app-catalog-models/app_catalog_models.thrift" |
| RESOURCE_CATALOG_THRIFT_FILE="${BASEDIR}data-models/resource-catalog-models/resource_catalog_models.thrift" |
| WORKFLOW_THRIFT_FILE="${BASEDIR}data-models/workflow-models/workflow_data_model.thrift" |
| PROFILE_SERVICE_THRIFT_FILE="${BASEDIR}service-cpis/profile-service/profile-service-cpi.thrift" |
| |
| DATAMODEL_SRC_DIR='../airavata-api/airavata-data-models/src/main/java' |
| JAVA_API_SDK_DIR='../airavata-api/airavata-api-stubs/src/main/java' |
| PHP_SDK_DIR='../airavata-api/airavata-client-sdks/airavata-php-sdk/src/main/resources/lib' |
| CPP_SDK_DIR='../airavata-api/airavata-client-sdks/airavata-cpp-sdk/src/main/resources/lib/airavata/' |
| PYTHON_SDK_DIR='../airavata-api/airavata-client-sdks/airavata-python-sdk/src/main/resources/lib/' |
| |
| # Initialize the thrift arguments. |
| # Since most of the Airavata API and Data Models have includes, use recursive option by default. |
| # Generate all the files in target directory |
| THRIFT_ARGS="-r -o ${BASEDIR}${BASE_TARGET_DIR}" |
| # Ensure the required target directories exists, if not create. |
| mkdir -p ${BASE_TARGET_DIR} |
| } |
| |
| |
| # The Function fail prints error messages on failure and quits the script. |
| fail() { |
| echo $@ |
| exit 1 |
| } |
| |
| # The function add_license_header adds the ASF V2 license header to all java files within the specified generated |
| # directory. The function also adds suppress all warnings annotation to all public classes and enum's |
| # To Call: |
| # add_license_header $generated_code_directory |
| add_license_header() { |
| |
| # Fetch the generated code directory passed as the argument |
| GENERATED_CODE_DIR=$1 |
| |
| # For each source file within the generated directory, add the ASF V2 LICENSE header |
| FILE_SUFFIXES=(.php .java .h .cpp) |
| for file in "${FILE_SUFFIXES[@]}"; do |
| for f in $(find ${GENERATED_CODE_DIR} -name "*$file"); do |
| cat - ${f} >${f}-with-license <<EOF |
| /** |
| * 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. |
| */ |
| |
| EOF |
| mv ${f}-with-license ${f} |
| done |
| done |
| } |
| |
| # The function compares every generated java file with the one in specified existing source location. If the comparison |
| # shows a difference, then it replaces with the newly generated file (with added license header). |
| # To Call: |
| # copy_changed_files $generated_code_directory $existing_source_directory |
| copy_changed_files() { |
| |
| # Read all the function arguments |
| GENERATED_CODE_DIR=$1 |
| WORKSPACE_SRC_DIR=$2 |
| |
| echo "Generated sources are in ${GENERATED_CODE_DIR}" |
| echo "Destination workspace is in ${WORKSPACE_SRC_DIR}" |
| |
| # Check if the newly generated files exist in the targeted workspace, if not copy. Only changed files will be synced. |
| # the extra slash to GENERATED_CODE_DIR is needed to ensure the parent directory itself is not copied. |
| rsync -auv ${GENERATED_CODE_DIR}/ ${WORKSPACE_SRC_DIR} |
| } |
| |
| ####################################### |
| # Generate/Update Airavata Data Model # |
| ####################################### |
| |
| generate_java_stubs() { |
| |
| #Java Beans generation directory |
| JAVA_BEAN_GEN_DIR=${BASE_TARGET_DIR}/gen-javabean |
| |
| # As a precaution remove and previously generated files if exists |
| rm -rf ${JAVA_BEAN_GEN_DIR} |
| |
| # Generate the Airavata Data Model using thrift Java Beans generator. This will take generate the classes in bean style |
| # with members being private and setters returning voids. |
| # The airavata_data_models.thrift includes rest of data models. |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen java:beans,generated_annotations=undated ${DATAMODEL_THRIFT_FILE} || fail unable to generate java bean thrift classes on base data model |
| |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen java:beans,generated_annotations=undated ${APP_CATALOG_THRIFT_FILE} || fail unable to generate java bean thrift classes on app catalog data models |
| |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen java:beans,generated_annotations=undated ${RESOURCE_CATALOG_THRIFT_FILE} || fail unable to generate java bean thrift classes on app catalog data models |
| |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen java:beans,generated_annotations=undated ${WORKFLOW_THRIFT_FILE} || fail unable to generate java bean thrift classes on app workflow data models |
| |
| # For the generated java beans add the ASF V2 License header |
| add_license_header $JAVA_BEAN_GEN_DIR |
| |
| # Compare the newly generated beans with existing sources and replace the changed ones. |
| copy_changed_files ${JAVA_BEAN_GEN_DIR} ${DATAMODEL_SRC_DIR} |
| |
| ############################################################################### |
| # Generate/Update source used by Airavata Server Skeletons & Java Client Stubs # |
| # JAVA server and client both use generated api-boilerplate-code # |
| ############################################################################### |
| |
| #Java generation directory |
| JAVA_GEN_DIR=${BASE_TARGET_DIR}/gen-java |
| |
| # As a precaution remove and previously generated files if exists |
| rm -rf ${JAVA_GEN_DIR} |
| |
| # Using thrift Java generator, generate the java classes based on Airavata API. This |
| # The airavata_api.thrift includes rest of data models. |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen java:generated_annotations=undated ${AIRAVATA_API_THRIFT_FILE} || fail unable to generate java thrift classes on AiravataAPI |
| |
| # For the generated java classes add the ASF V2 License header |
| add_license_header $JAVA_GEN_DIR |
| |
| # Compare the newly generated classes with existing java generated skeleton/stub sources and replace the changed ones. |
| # Only copying the API related classes and avoiding copy of any data models which already exist in the data-models. |
| copy_changed_files ${JAVA_GEN_DIR}/org/apache/airavata/api ${JAVA_API_SDK_DIR}/org/apache/airavata/api |
| |
| echo "Successfully generated new java sources, compared against exiting code and replaced the changed files" |
| } |
| |
| #################################### |
| # Generate/Update PHP Stubs # |
| #################################### |
| |
| generate_php_stubs() { |
| |
| #PHP generation directory |
| PHP_GEN_DIR=${BASE_TARGET_DIR}/gen-php |
| |
| # As a precaution remove and previously generated files if exists |
| rm -rf ${PHP_GEN_DIR} |
| |
| # Using thrift Java generator, generate the PHP classes based on Airavata API. This |
| # The airavata_api.thrift includes rest of data models. |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen php:autoload ${DATAMODEL_THRIFT_FILE} || fail unable to generate PHP thrift classes |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen php:autoload ${APP_CATALOG_THRIFT_FILE} || fail unable to generate PHP thrift classes |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen php:autoload ${RESOURCE_CATALOG_THRIFT_FILE} || fail unable to generate PHP thrift classes |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen php:autoload ${AIRAVATA_API_THRIFT_FILE} || fail unable to generate PHP thrift classes |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen php:autoload ${PROFILE_SERVICE_THRIFT_FILE} || fail unable to generate PHP thrift classes |
| |
| # For the generated java classes add the ASF V2 License header |
| ## TODO Write PHP license parser |
| |
| # Compare the newly generated classes with existing java generated skeleton/stub sources and replace the changed ones. |
| # Only copying the API related classes and avoiding copy of any data models which already exist in the data-models. |
| copy_changed_files ${PHP_GEN_DIR} ${PHP_SDK_DIR} |
| |
| } |
| |
| #################################### |
| # Generate/Update C++ Client Stubs # |
| #################################### |
| |
| generate_cpp_stubs() { |
| |
| #CPP generation directory |
| CPP_GEN_DIR=${BASE_TARGET_DIR}/gen-cpp |
| |
| # As a precaution remove and previously generated files if exists |
| rm -rf ${CPP_GEN_DIR} |
| |
| # Using thrift Java generator, generate the java classes based on Airavata API. This |
| # The airavata_api.thrift includes rest of data models. |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen cpp ${AIRAVATA_API_THRIFT_FILE} || fail unable to generate C++ thrift classes |
| |
| # For the generated CPP classes add the ASF V2 License header |
| add_license_header $CPP_GEN_DIR |
| |
| # Compare the newly generated classes with existing java generated skeleton/stub sources and replace the changed ones. |
| # Only copying the API related classes and avoiding copy of any data models which already exist in the data-models. |
| copy_changed_files ${CPP_GEN_DIR} ${CPP_SDK_DIR} |
| |
| } |
| |
| #################################### |
| # Generate/Update C++ Client Stubs # |
| #################################### |
| |
| generate_python_stubs() { |
| |
| #Python generation directory |
| PYTHON_GEN_DIR=${BASE_TARGET_DIR}/gen-py |
| |
| # As a precaution remove and previously generated files if exists |
| rm -rf ${PYTHON_GEN_DIR} |
| |
| # Using thrift Python generator, generate the python classes based on Airavata API. This |
| # The airavata_api.thrift includes rest of data models. |
| $THRIFT_EXEC ${THRIFT_ARGS} --gen py ${AIRAVATA_API_THRIFT_FILE} || fail unable to generate Python thrift classes |
| |
| # For the generated CPP classes add the ASF V2 License header |
| #add_license_header #PYTHON_GEN_DIR |
| |
| # Compare the newly generated classes with existing java generated skeleton/stub sources and replace the changed ones. |
| # Only copying the API related classes and avoiding copy of any data models which already exist in the data-models. |
| copy_changed_files ${PYTHON_GEN_DIR} ${PYTHON_SDK_DIR} |
| |
| } |
| |
| for arg in "$@" |
| do |
| case "$arg" in |
| all) echo "Generate all stubs (Java, PHP, C++, Python) Stubs" |
| setup |
| generate_java_stubs |
| generate_php_stubs |
| generate_cpp_stubs |
| generate_python_stubs |
| ;; |
| java) echo "Generating Java Stubs" |
| setup |
| generate_java_stubs |
| ;; |
| php) echo "Generate PHP Stubs" |
| setup |
| generate_php_stubs |
| ;; |
| cpp) echo "Generate C++ Stubs" |
| setup |
| generate_cpp_stubs |
| ;; |
| python) echo "Generate Python Stubs" |
| setup |
| generate_python_stubs |
| ;; |
| --native-thrift) |
| THRIFT_NATIVE="true" |
| ;; |
| *) echo "Invalid or unsupported option" |
| show_usage |
| exit 1 |
| ;; |
| esac |
| done |
| |
| #################### |
| # Cleanup and Exit # |
| #################### |
| # CleanUp: Delete the base target build directory |
| #rm -rf ${BASE_TARGET_DIR} |
| |
| exit 0 |