From 64f9d7bb34c3b48bcc9ad203aa73a631049f640c Mon Sep 17 00:00:00 2001 From: TAKAHASHI Shinya Date: Wed, 12 Jan 2022 11:18:41 +0000 Subject: [PATCH] first commit --- JDSmessages.zip | Bin 0 -> 146226 bytes LICENSE | 339 +++++ README.md | 175 +++ about.bmp | Bin 0 -> 39958 bytes about.png | Bin 0 -> 1406 bytes all-in-one.bonitastudio-features.product | 95 ++ all-in-one.installer.installer.properties | 49 + ...in-one.installer.installer_project_template.xml | 502 +++++++ bonita-studio.pom.xml | 330 ++++ build-script.sh | 423 ++++++ ...les.features.rootfiles-feature.build.properties | 2 + bundles.features.studio-feature.feature.xml | 723 +++++++++ bundles.plugins.application.plugin.xml | 1585 ++++++++++++++++++++ ...o.application.BonitaStudioWorkbenchAdvisor.java | 725 +++++++++ ...pplication.actions.OpenIntroCommandHnadler.java | 32 + ...dio.application.coolbar.WelcomeCoolbarItem.java | 82 + bundles.plugins.engine.plugin.xml | 180 +++ ....bonitasoft.studio.engine.BOSEngineManager.java | 446 ++++++ bundles.plugins.intro.content.introContent.xml | 5 + bundles.plugins.intro.content.welcome.html | 151 ++ bundles.plugins.intro.plugin.properties | 1 + bundles.plugins.intro.plugin.xml | 35 + bundles.plugins.pom.xml | 151 ++ bundles.plugins.studio-product.plugin.xml | 59 + console.libs.build.properties | 4 + console.libs.pom.xml | 255 ++++ jds.ico | Bin 0 -> 49206 bytes jdsicons.zip | Bin 0 -> 14060 bytes splash.bmp | Bin 0 -> 360138 bytes splash.png | Bin 0 -> 10525 bytes studio-product.pom.xml | 41 + 31 files changed, 6390 insertions(+) create mode 100644 JDSmessages.zip create mode 100644 LICENSE create mode 100644 README.md create mode 100644 about.bmp create mode 100644 about.png create mode 100644 all-in-one.bonitastudio-features.product create mode 100644 all-in-one.installer.installer.properties create mode 100644 all-in-one.installer.installer_project_template.xml create mode 100644 bonita-studio.pom.xml create mode 100644 build-script.sh create mode 100644 bundles.features.rootfiles-feature.build.properties create mode 100644 bundles.features.studio-feature.feature.xml create mode 100644 bundles.plugins.application.plugin.xml create mode 100644 bundles.plugins.application.src.org.bonitasoft.studio.application.BonitaStudioWorkbenchAdvisor.java create mode 100644 bundles.plugins.application.src.org.bonitasoft.studio.application.actions.OpenIntroCommandHnadler.java create mode 100644 bundles.plugins.application.src.org.bonitasoft.studio.application.coolbar.WelcomeCoolbarItem.java create mode 100644 bundles.plugins.engine.plugin.xml create mode 100644 bundles.plugins.engine.src.org.bonitasoft.studio.engine.BOSEngineManager.java create mode 100644 bundles.plugins.intro.content.introContent.xml create mode 100644 bundles.plugins.intro.content.welcome.html create mode 100644 bundles.plugins.intro.plugin.properties create mode 100644 bundles.plugins.intro.plugin.xml create mode 100644 bundles.plugins.pom.xml create mode 100644 bundles.plugins.studio-product.plugin.xml create mode 100644 console.libs.build.properties create mode 100644 console.libs.pom.xml create mode 100644 jds.ico create mode 100644 jdsicons.zip create mode 100644 splash.bmp create mode 100644 splash.png create mode 100644 studio-product.pom.xml diff --git a/JDSmessages.zip b/JDSmessages.zip new file mode 100644 index 0000000000000000000000000000000000000000..4510dd7cf605df7c6ab978b11260c22b8a7c2503 GIT binary patch literal 146226 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
Language
+ osgi.nl + ${installation_language_code} + + + @shortcut.comment@ + ~/Desktop/@product.short.name@-${product_version} + ${installdir}/@mac.shortcut.name@ + + + osx + + + + + xdg-user-dir + DESKTOP + desktop_path + 0 + 0 + + + linux + + + is_in_path + xdg-user-dir + + + + + + + xdg-user-dir + DESKTOP + desktop_path + 0 + 0 + + + + + linux + + + is_in_path + xdg-user-dir + + + + + + + + + + + ${desktop_path}/@product.short.name@-${product_version}.desktop + utf-8 + + [Desktop Entry] + Version=1.0 + Encoding=UTF-8 + Name=@product.short.name@-${product_version} + GenericName=@product.short.name@-${product_version} + Comment=@shortcut.comment@ + Exec=${installdir}/@linux.shortcut.name@ + Icon=${installdir}/bonitasoft-icon-128-128-transparent.png + Terminal=false + Type=Application + + + + + + + + linux + + + + + + + + + + 1 + windows + + + + + utf-8 + ${installdir}/@mac.shortcut.name@/Contents/Eclipse/@product.short.name@.ini + exact + + + -startup + -vm +${installdir}/@mac.shortcut.name@/Contents/Eclipse/jre/Contents/Home/bin/java +-startup + + + + + osx + + + + + + + osx + + + + + + + + + osx + + + open + "${installdir}/@mac.shortcut.name@" & + ${msg(launch)} ${product_fullname} + + + + + linux + + + ${installdir}/@linux.shortcut.name@ + & + ${msg(launch)} ${product_fullname} + + + + + windows + + + ${installdir}\${windowsExecName} + & + ${msg(launch)} ${product_fullname} + + + + + 0 + 1 + @vendor@ + + + install + Install distribution component + 1 + 1 + 1 + + + @shortcut.comment@ + + + @shortcut.name@ + + windows + 0 + "${installdir}/${windowsExecName}" + + + ${installdir}/ + + + @shortcut.comment@ + ${installdir}/@linux.shortcut.name@ + ${installdir}/@linux.icon@ + @shortcut.name@ + ${installdir} + linux + 0 + + + + + + + + + Linux Program Files + ${installdir} + linux_programfiles + linux + + + @studio.dir@/** + + + + + Linux Program Files x64 + ${installdir} + linux_programfiles_64 + linux-x64 + + + @studio.dir@/** + + + + + Windows Program Files + ${installdir} + win_programfiles + windows + + + @studio.dir@/** + + + + + OSX Program Files + ${installdir} + osx_programfiles + osx + + + @mac.studio.dir@/** + + + + + + + @shortcut.comment@ + @shortcut.name@ + 0 + ${installdir}/${windowsExecName} + + + ${installdir}/ + + + Uninstall ${product_fullname} + Uninstall ${product_fullname} + 0 + ${installdir}/${uninstallerName}.exe + + + ${installdir}/ + + + + + + + installdir + Installer.Parameter.installdir.description + Installer.Parameter.installdir.explanation + + ${platform_install_prefix}/@product.short.name@-${product_version} + 0 + yes + prefix + yes + 0 + + + ${msg(installdir.must.be.empty.folder)} + + + 1 + osx + + + + + + ${msg(installdir.must.be.empty.folder)} + + + + + + + ${msg(not.enough.diskspace)} + + + less + ${installdir} + + ${required_diskspace} + + + + + + + antivirusPage + ${msg(antivirus.detected.title)} + + installation + + + visitMicrosoftSuuport + ${msg(visit.microsoft.website)} + ${msg(antivirus.detected.message)} + + + http://www.bonitasoft.com/bos_redirect.php?bos_redirect_id=714&bos_redirect_product=bos&bos_version=@product.version@ + + + + + + + + + + + + ${desktop_path}/@product.short.name@-${product_version}.desktop + + + yes + ${msg(keep.workspace.msg)} + ${msg(keep.workspace.title)} + saveWorkspace + + + + + ${installdir} + + + ${saveWorkspace} + + + + + diff --git a/bonita-studio.pom.xml b/bonita-studio.pom.xml new file mode 100644 index 0000000..e5f3ca2 --- /dev/null +++ b/bonita-studio.pom.xml @@ -0,0 +1,330 @@ + + + 4.0.0 + org.bonitasoft.studio + studio + 7.13.0 + pom + Bonita Studio + + 2.3.0 + 11 + + 2021.2-u0 + ${project.version} + 1.13.20 + ${project.version} + ${project.version} + ${project.parent.version} + 9.0.52 + 1.1.2 + 0.0.3 + https://osdn.dl.osdn.net/storage/g/j/ja/japandigitalstudio/p2/4.20 + UTF-8 + ignore + ${java.version} + ${java.version} + 3.0.8 + + 3.1.2 + + + patched-plugins + + + + + + + org.apache.felix + maven-bundle-plugin + 4.2.1 + + + org.bonitasoft.maven + image-overlay-plugin + ${image-overlay-plugin.version} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + org.apache.maven.plugins + maven-clean-plugin + 3.1.0 + + + org.eclipse.tycho + tycho-versions-plugin + ${tychoVersion} + + + org.eclipse.tycho.extras + tycho-eclipserun-plugin + ${tychoVersion} + + + org.eclipse.tycho + tycho-packaging-plugin + ${tychoVersion} + + false + false + + false + + + + + org.apache.maven.plugins + maven-dependency-plugin + ${maven-dependency-plugin.version} + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + org.apache.maven.plugins + maven-antrun-plugin + 1.8 + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + + org.eclipse.tycho + tycho-surefire-plugin + ${tychoVersion} + + false + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.0.0 + + + org.eclipse.tycho + tycho-compiler-plugin + ${tychoVersion} + + -warn:+discouraged,forbidden + false + + + + org.eclipse.tycho + target-platform-configuration + ${tychoVersion} + + JavaSE-11 + + + linux + gtk + x86_64 + + + macosx + cocoa + x86_64 + + + win32 + win32 + x86_64 + + + + + org.bonitasoft.studio + platform + ${platform.version} + + + + + eclipse-plugin + org.bonitasoft.studioEx.console.libs + + + + + + + org.codehaus.gmaven + groovy-maven-plugin + 2.1.1 + + + org.codehaus.groovy + groovy-xml + ${groovy-maven-plugin.groovy.version} + + + + + + + + org.codehaus.gmaven + groovy-maven-plugin + + + initialize + + execute + + + + project.properties["branding.version.short"] = "${branding.version}".replaceAll('-.*', '') + + + + + + + org.eclipse.tycho + tycho-versions-plugin + + + + org.eclipse.tycho + tycho-maven-plugin + ${tychoVersion} + true + + + org.eclipse.tycho + target-platform-configuration + + + + + + + + org.bonitasoft.engine.data + bonita-business-data-generator + ${engine.version} + + + org.bonitasoft.maven + bonita-project-report-model + ${bonita-project-report-model.version} + + + org.bonitasoft.web + ui-designer-artifact-builder + ${ui.designer.version} + + + junit + junit + 4.13.1 + test + + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + true + + + false + + + + + + + jdk11-tests + + true + + + + + org.apache.maven.plugins + maven-toolchains-plugin + 1.1 + + + validate + + toolchain + + + + + + + 11 + OpenJDK + + + + + + + + + default + + true + + + platform + tests-dependencies + bundles + + + + all-in-one + + true + + + all-in-one + + + + it + + tests + + + + macosx-jvm-flags + + + mac + + + + -XstartOnFirstThread + + + + + + diff --git a/build-script.sh b/build-script.sh new file mode 100644 index 0000000..886c43e --- /dev/null +++ b/build-script.sh @@ -0,0 +1,423 @@ +#!/bin/bash + +set -u +set -e +set +o nounset + +# Workaround for at least Debian Buster +# Require to build bonita-portal-js due to issue with PhantomJS launched by Karma +# See https://github.com/ariya/phantomjs/issues/14520 +export OPENSSL_CONF=/etc/ssl + +# Script configuration +# You can set the following environment variables +BONITA_BUILD_NO_CLEAN=${BONITA_BUILD_NO_CLEAN:-true} +BONITA_BUILD_QUIET=${BONITA_BUILD_QUIET:-false} +BONITA_BUILD_STUDIO_ONLY=${BONITA_BUILD_STUDIO_ONLY:-true} +BONITA_BUILD_STUDIO_SKIP=${BONITA_BUILD_STUDIO_SKIP:-false} + +# Bonita version + +BONITA_VERSION=7.13.0 + + +######################################################################################################################## +# SCM AND BUILD FUNCTIONS +######################################################################################################################## + +# $1: the message to be displayed as header +echoHeaders() { + echo + echo + echo "============================================================" + echo "$1" + echo "============================================================" +} + +# params: +# - Git repository name +# - Tag name (optional) +# - Checkout folder name (optional) +checkout() { + # We need at least one parameter (the repository name) and no more than three (repository name, tag name and checkout folder name) + if [ "$#" -lt 1 ] || [ "$#" -gt 3 ]; then + echo "Incorrect number of parameters: $@" + exit 1 + fi + + repository_name="$1" + + if [ "$#" -ge 2 ]; then + tag_name="$2" + else + # If we don't have a tag name assume that the tag is named with the Bonita version + tag_name=$BONITA_VERSION + fi + echoHeaders "Processing ${repository_name} ${tag_name}" + + if [ "$#" -eq 3 ]; then + checkout_folder_name="$3" + else + # If no checkout folder path is provided use the repository name as destination folder name + checkout_folder_name="$repository_name" + fi + + # If we don't already clone the repository do it + if [ ! -d "$checkout_folder_name/.git" ]; then + git clone --depth 1 "https://github.com/bonitasoft/$repository_name.git" $checkout_folder_name + fi + # Ensure we fetch all the tags and that we are on the appropriate one + git -C $checkout_folder_name fetch --tags + git -C $checkout_folder_name reset --hard tags/$tag_name + + # Move to the repository clone folder (required to run Maven/Gradle wrapper) + cd $checkout_folder_name +} + +run_maven_with_standard_system_properties() { + build_command="$build_command -Dengine.version=$BONITA_VERSION -Dfilters.version=$BONITA_VERSION" + echo "[DEBUG] Running build command: $build_command" + eval "$build_command" + # Go back to script folder (checkout move current directory to project checkout folder. + cd .. +} + +run_gradle_with_standard_system_properties() { + echo "[DEBUG] Running build command: $build_command" + eval "$build_command" + # Go back to script folder (checkout move current directory to project checkout folder. + cd .. +} + +build_maven_wrapper() { + build_command="./mvnw" +} + +build_gradle_wrapper() { + build_command="./gradlew" +} + +build_quiet_if_requested() { + if [[ "${BONITA_BUILD_QUIET}" == "true" ]]; then + echo "Configure quiet build" + build_command="$build_command --quiet" + fi +} + +build() { + build_command="$build_command build" +} + +publishToMavenLocal() { + build_command="$build_command publishToMavenLocal" +} + +clean() { + if [[ "${BONITA_BUILD_NO_CLEAN}" == "true" ]]; then + echo "Configure build to skip clean task" + else + build_command="$build_command clean" + fi +} + +install() { + build_command="$build_command install" +} + +verify() { + build_command="$build_command verify" +} + +skiptest() { + build_command="$build_command -DskipTests" +} + +gradle_test_skip() { + build_command="$build_command -x test" +} + +profile() { + build_command="$build_command -P$1" +} + +# params: +# - Git repository name +# - Profile name +build_maven_wrapper_verify_skiptest_with_profile() +{ + checkout $1 + build_maven_wrapper + build_quiet_if_requested + clean + verify + skiptest + profile $2 + run_maven_with_standard_system_properties +} + +# params: +# - Git repository name +build_maven_wrapper_install_skiptest() +{ + checkout "$@" + unzip jdsicons.zip + unzip -o JDSmessages.zip + cp bonita-studio.pom.xml bonita-studio/pom.xml + cp bundles.plugins.pom.xml bonita-studio/bundles/plugins/pom.xml + cp console.libs.pom.xml bonita-studio/bundles/plugins/org.bonitasoft.studio.console.libs/pom.xml + cp bundles.features.studio-feature.feature.xml bonita-studio/bundles/features/studio-feature/feature.xml + cp console.libs.build.properties bonita-studio/bundles/plugins/org.bonitasoft.studio.console.libs/build.properties + rm bonita-studio/bundles/plugins/org.bonitasoft.studio.console.libs/META-INF/p2.inf + cp splash.bmp bonita-studio/bundles/plugins/org.bonitasoft.studio-product/splash_without_version.bmp + cp splash.bmp bonita-studio/bundles/plugins/org.bonitasoft.studio-product/src/org/bonitasoft/studiosplash_without_version.bmp + cp splash.bmp bonita-studio/bundles/plugins/org.bonitasoft.studio-product/splash.bmp + cp about.bmp bonita-studio/bundles/plugins/org.bonitasoft.studio-product/about.bmp + cp studio-product.pom.xml bonita-studio/bundles/plugins/org.bonitasoft.studio-product/pom.xml + cp bundles.plugins.studio-product.plugin.xml bonita-studio/bundles/plugins/org.bonitasoft.studio-product/plugin.xml + cp bundles.plugins.intro.plugin.xml bonita-studio/bundles/plugins/org.bonitasoft.studio.intro/plugin.xml + cp bundles.plugins.intro.plugin.properties bonita-studio/bundles/plugins/org.bonitasoft.studio.intro/plugin.properties + cp bundles.plugins.intro.content.introContent.xml bonita-studio/bundles/plugins/org.bonitasoft.studio.intro/content/introContent.xml + cp bundles.plugins.intro.content.welcome.html bonita-studio/bundles/plugins/org.bonitasoft.studio.intro/content/welcome.html + cp all-in-one.bonitastudio-features.product bonita-studio/all-in-one/bonitastudio-features.product + rm bonita-studio/bundles/plugins/org.bonitasoft.studio.application/src/org/bonitasoft/studio/application/coolbar/WelcomeCoolbarItem.java + cp bundles.plugins.application.src.org.bonitasoft.studio.application.actions.OpenIntroCommandHnadler.java bonita-studio/bundles/plugins/org.bonitasoft.studio.application/src/org/bonitasoft/studio/application/actions/OpenIntroCommandHandler.java + cp bundles.plugins.application.src.org.bonitasoft.studio.application.BonitaStudioWorkbenchAdvisor.java bonita-studio/bundles/plugins/org.bonitasoft.studio.application/src/org/bonitasoft/studio/application/BonitaStudioWorkbenchAdvisor.java + rm bonita-studio/bundles/plugins/org.bonitasoft.studio.engine/src/org/bonitasoft/studio/engine/coolbar/OpenPortalCoolbarItem.java + rm bonita-studio/bundles/plugins/org.bonitasoft.studio.engine/src/org/bonitasoft/studio/engine/coolbar/RunCoolbarItem.java + cp bundles.plugins.application.plugin.xml bonita-studio/bundles/plugins/org.bonitasoft.studio.application/plugin.xml + cp bundles.plugins.engine.plugin.xml bonita-studio/bundles/plugins/org.bonitasoft.studio.engine/plugin.xml + cp bundles.plugins.engine.src.org.bonitasoft.studio.engine.BOSEngineManager.java bonita-studio/bundles/plugins/org.bonitasoft.studio.engine/src/org/bonitasoft/studio/engine/BOSEngineManager.java install + build_maven_wrapper + build_quiet_if_requested + clean + skiptest + run_maven_with_standard_system_properties +} + +build_gradle_wrapper_test_skip_publishToMavenLocal() { + checkout "$@" + build_gradle_wrapper + build_quiet_if_requested + clean + gradle_test_skip + profile forceCurrentVersion=7.13.0 + publishToMavenLocal + run_gradle_with_standard_system_properties +} + +######################################################################################################################## +# PARAMETERS PARSING AND VALIDATIONS +######################################################################################################################## + +OS_IS_LINUX=false +OS_IS_MAC=false +OS_IS_WINDOWS=false + +detectOS() { + case "`uname`" in + CYGWIN*) OS_IS_WINDOWS=true;; + MINGW*) OS_IS_WINDOWS=true;; + Darwin*) OS_IS_MAC=true;; + *) OS_IS_LINUX=true;; + esac +} + +logBuildInfo() { + echo "OS information" + if [[ "${OS_IS_LINUX}" == "true" ]]; then + echo " > Run on Linux" + echo "$(cat /etc/lsb-release)" | xargs -L 1 -I % echo " %" + elif [[ "${OS_IS_MAC}" == "true" ]]; then + echo " > Run on MacOS" + echo "$(sw_vers)" | xargs -L 1 -I % echo " %" + else + echo " > Run on Windows" + echo "$(wmic os get Caption,OSArchitecture,Version //value)" | xargs -L 1 --no-run-if-empty -I % echo " %" | grep -v -e '^[[:space:]]*$' + fi + echo " > Generic information: $(uname -a)" + + echo "Build environment" + echo " > Use $(git --version)" + echo " > Commit: $(git rev-parse FETCH_HEAD)" + + echo "Build settings" + echo " > BONITA_VERSION: ${BONITA_VERSION}" + echo " > BONITA_BUILD_NO_CLEAN: ${BONITA_BUILD_NO_CLEAN}" + echo " > BONITA_BUILD_QUIET: ${BONITA_BUILD_QUIET}" + echo " > BONITA_BUILD_STUDIO_ONLY: ${BONITA_BUILD_STUDIO_ONLY}" + echo " > BONITA_BUILD_STUDIO_SKIP: ${BONITA_BUILD_STUDIO_SKIP}" +} + +checkPrerequisites() { + echo "Prerequisites" +# if [[ "${OS_IS_LINUX}" == "true" ]]; then +# if [[ "${BONITA_BUILD_STUDIO_SKIP}" == "false" ]]; then +# # Test that x server is running. Required to generate Bonita Studio models +# # Can be ignored if Studio is build without the "generate" Maven profile +# +# if ! xset q &>/dev/null; then +# echo "No X server at \$DISPLAY [$DISPLAY]" >&2 +# exit 1 +# fi +# echo " > X server running correctly" +# fi +# fi +# + # Test if Curl exists + if hash curl 2>/dev/null; then + CURL_VERSION="$(curl --version 2>&1 | awk -F " " 'NR==1 {print $2}')" + echo " > Use curl version: $CURL_VERSION" + else + echo "curl not found. Exiting." + exit 1 + fi + + checkJavaVersion +} + +checkJavaVersion() { + local JAVA_CMD= + echo " > Java prerequisites" + echo " Check if Java version is compatible with Bonita" + + if [[ "x$JAVA" = "x" ]]; then + if [[ "x$JAVA_HOME" != "x" ]]; then + echo " JAVA_HOME is set" + JAVA_CMD="$JAVA_HOME/bin/java" + else + echo " JAVA_HOME is not set. Use java in path" + JAVA_CMD="java" + fi + else + JAVA_CMD=${JAVA} + fi + echo " Java command path is $JAVA_CMD" + + java_full_version_details=$("$JAVA_CMD" -version 2>&1) + echo " JVM details" + echo "${java_full_version_details}" | xargs -L 1 -I % echo " %" + + java_full_version=$("$JAVA_CMD" -version 2>&1 | grep -i version | sed 's/.*version "\(.*\)".*$/\1/g') + echo " Java full version: $java_full_version" + if [[ "x$java_full_version" = "x" ]]; then + echo "No Java command could be found. Please set JAVA_HOME variable to a JDK and/or add the java executable to your PATH" + exit 1 + fi + + java_version_1st_digit=$(echo "$java_full_version" | sed 's/\(.*\)\..*\..*$/\1/g') + java_version_expected=11 + # pre Java 9 versions, get minor version + if [[ "$java_version_1st_digit" -eq "1" ]]; then + java_version=$(echo "$java_full_version" | sed 's/.*\.\(.*\)\..*$/\1/g') + else + java_version=${java_version_1st_digit} + fi + echo " Java version: $java_version" + + if [[ "$java_version" -ne "$java_version_expected" ]]; then + echo "Invalid Java version $java_version not $java_version_expected. Please set JAVA_HOME environment variable to a valid JDK version, and/or add the java executable to your PATH" + exit 1 + fi + echo " Java version is compatible with Bonita" +} + + +######################################################################################################################## +# TOOLING +######################################################################################################################## + +detectWebPagesDependenciesVersions() { + echoHeaders "Detecting web-pages dependencies versions" + local webPagesGradleBuild=`curl -sS -X GET https://raw.githubusercontent.com/bonitasoft/bonita-web-pages/${BONITA_VERSION}/build.gradle` + + WEB_PAGES_UID_VERSION=`echo "${webPagesGradleBuild}" | tr -s "[:blank:]" | tr -d "\n" | sed 's@.*UIDesigner {\(.*\)"}.*@\1@g' | sed 's@.*version "\(.*\)@\1@g'` + echo "WEB_PAGES_UID_VERSION: ${WEB_PAGES_UID_VERSION}" +} + +detectStudioDependenciesVersions() { +# echoHeaders "Detecting Studio dependencies versions" +# local studioPom=`curl -sS -X GET https://raw.githubusercontent.com/bonitasoft/bonita-studio/${BONITA_VERSION}/pom.xml` + +# STUDIO_UID_VERSION=`echo "${studioPom}" | grep \ | sed 's@.*>\(.*\)<.*@\1@g'` + STUDIO_UID_VERSION=1.13.20 + echo "STUDIO_UID_VERSION: ${STUDIO_UID_VERSION}" +} + + + +######################################################################################################################## +# MAIN +######################################################################################################################## +detectOS +logBuildInfo +checkPrerequisites +echo + +# List of repositories on https://github.com/bonitasoft that you don't need to build +# Note that archived repositories are not listed here, as they are only required to build old Bonita versions +# +# angular-strap: automatically downloaded in the build of bonita-web project. +# babel-preset-bonita: automatically downloaded in the build of bonita-ui-designer project. +# bonita-codesign-windows: use to sign Windows binaries when building using Bonita Continuous Integration. +# bonita-connector-talend: deprecated. +# bonita-continuous-delivery-doc: Bonita Enterprise Edition Continuous Delivery module documentation. +# bonita-custom-page-seed: a project to start building a custom page. Deprecated in favor of UI Designer page + REST API extension. +# bonita-doc: Bonita documentation. +# bonita-developer-resources: guidelines for contributing to Bonita, contributor license agreement, code style... +# bonita-examples: Bonita usage code examples. +# bonita-ici-doc: Bonita Enterprise Edition AI module documentation. +# bonita-js-components: automatically downloaded in the build of projects that require it. +# bonita-migration: migration tool to update a server from a previous Bonita release. +# bonita-page-authorization-rules: documentation project to provide an example for page mapping authorization rule. +# bonita-connector-sap: deprecated. Use REST connector instead. +# bonita-vacation-management-example: an example for Bonita Enterprise Edition Continuous Delivery module. +# bonita-web-devtools: Bonitasoft internal development tools. +# bonita-widget-contrib: project to start building custom widgets outside UI Designer. +# create-react-app: required for Bonita Subscription Intelligent Continuous Improvement module. +# dojo: Bonitasoft R&D coding dojos. +# jscs-preset-bonita: Bonita JavaScript code guidelines. +# ngUpload: automatically downloaded in the build of bonita-ui-designer project. +# preact-chartjs-2: required for Bonita Subscription Intelligent Continuous Improvement module. +# preact-content-loader: required for Bonita Subscription Intelligent Continuous Improvement module. +# restlet-framework-java: /!\ +# swt-repo: legacy repository required by Bonita Studio. Deprecated. +# training-presentation-tool: fork of reveal.js with custom look and feel. +# widget-builder: automatically downloaded in the build of bonita-ui-designer project. +# bonita-studio-watchdog: obsolete since 7.10 (included in bonita-studio). + + +if [[ "${BONITA_BUILD_STUDIO_ONLY}" == "false" ]]; then + build_gradle_wrapper_test_skip_publishToMavenLocal bonita-engine + + build_maven_wrapper_install_skiptest bonita-web-extensions + + build_maven_wrapper_install_skiptest bonita-web + build_maven_wrapper_install_skiptest bonita-portal-js + + # bonita-web-pages uses a dedicated UID version + detectWebPagesDependenciesVersions + build_maven_wrapper_install_skiptest bonita-ui-designer ${WEB_PAGES_UID_VERSION} + build_gradle_wrapper_test_skip_publishToMavenLocal bonita-web-pages + + build_maven_wrapper_install_skiptest bonita-application-directory + build_maven_wrapper_install_skiptest bonita-user-application + build_maven_wrapper_install_skiptest bonita-admin-application + build_maven_wrapper_install_skiptest bonita-super-admin-application + + build_maven_wrapper_install_skiptest bonita-distrib +else + echoHeaders "Skipping all build prior the Studio part" + build_gradle_wrapper_test_skip_publishToMavenLocal bonita-engine +fi + +if [[ "${BONITA_BUILD_STUDIO_SKIP}" == "false" ]]; then + build_maven_wrapper_install_skiptest bonita-data-repository + + # bonita-studio uses a dedicated UID version + detectStudioDependenciesVersions + build_maven_wrapper_install_skiptest bonita-ui-designer ${STUDIO_UID_VERSION} + + build_maven_wrapper_verify_skiptest_with_profile bonita-studio default,all-in-one,!jdk11-tests +else + echoHeaders "Skipping the Studio build" +fi diff --git a/bundles.features.rootfiles-feature.build.properties b/bundles.features.rootfiles-feature.build.properties new file mode 100644 index 0000000..b3bbbb7 --- /dev/null +++ b/bundles.features.rootfiles-feature.build.properties @@ -0,0 +1,2 @@ +bin.includes=feature.xml +root=file:jds-icon-128-128-transparent.png diff --git a/bundles.features.studio-feature.feature.xml b/bundles.features.studio-feature.feature.xml new file mode 100644 index 0000000..dbd06f4 --- /dev/null +++ b/bundles.features.studio-feature.feature.xml @@ -0,0 +1,723 @@ + + + + + Core feature of Bonita BPM Studio + + + + Copyright (C) 2009-2015 Bonitasoft S.A. +Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble +This program is free software: you can redistribute it and/or +modify +it under the terms of the GNU General Public License as published +by +the Free Software Foundation, either version 2.0 of the License, +or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. + + + + Copyright (C) 2009-2021 Bonitasoft S.A. +Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble +This program is free software: you can redistribute it and/or +modify +it under the terms of the GNU General Public License as published +by +the Free Software Foundation, either version 2.0 of the License, +or +(at your option) any later version. +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles.plugins.application.plugin.xml b/bundles.plugins.application.plugin.xml new file mode 100644 index 0000000..e09b356 --- /dev/null +++ b/bundles.plugins.application.plugin.xml @@ -0,0 +1,1585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles.plugins.application.src.org.bonitasoft.studio.application.BonitaStudioWorkbenchAdvisor.java b/bundles.plugins.application.src.org.bonitasoft.studio.application.BonitaStudioWorkbenchAdvisor.java new file mode 100644 index 0000000..5280916 --- /dev/null +++ b/bundles.plugins.application.src.org.bonitasoft.studio.application.BonitaStudioWorkbenchAdvisor.java @@ -0,0 +1,725 @@ +/** + * Copyright (C) 2009-2011 BonitaSoft S.A. + * BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2.0 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.bonitasoft.studio.application; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.net.URL; +import java.util.Objects; +import java.util.stream.Stream; + +import org.apache.maven.cli.configuration.SettingsXmlConfigurationProcessor; +import org.bonitasoft.studio.application.contribution.IPreShutdownContribution; +import org.bonitasoft.studio.application.handler.OpenReleaseNoteHandler; +import org.bonitasoft.studio.application.i18n.Messages; +import org.bonitasoft.studio.common.DateUtil; +import org.bonitasoft.studio.common.FileUtil; +import org.bonitasoft.studio.common.ProjectUtil; +import org.bonitasoft.studio.common.RedirectURLBuilder; +import org.bonitasoft.studio.common.extension.BonitaStudioExtensionRegistryManager; +import org.bonitasoft.studio.common.extension.IPostStartupContribution; +import org.bonitasoft.studio.common.jface.MessageDialogWithLink; +import org.bonitasoft.studio.common.log.BonitaStudioLog; +import org.bonitasoft.studio.common.platform.tools.PlatformUtil; +import org.bonitasoft.studio.common.repository.AbstractRepository; +import org.bonitasoft.studio.common.repository.RepositoryManager; +import org.bonitasoft.studio.common.repository.core.ActiveOrganizationProvider; +import org.bonitasoft.studio.common.repository.core.maven.DependencyGetOperation; +import org.bonitasoft.studio.common.repository.core.maven.contribution.InstallBonitaMavenArtifactsOperation; +import org.bonitasoft.studio.common.repository.core.maven.migration.model.GAV; +import org.bonitasoft.studio.common.repository.core.maven.repository.MavenRepositories; +import org.bonitasoft.studio.designer.core.UIDesignerServerManager; +import org.bonitasoft.studio.engine.BOSEngineManager; +import org.bonitasoft.studio.engine.BOSWebServerManager; +import org.bonitasoft.studio.engine.server.StartEngineJob; +import org.bonitasoft.studio.model.process.diagram.part.ProcessDiagramEditorPlugin; +import org.bonitasoft.studio.model.process.impl.ContractInputImpl; +import org.bonitasoft.studio.preferences.BonitaStudioPreferencesPlugin; +import org.bonitasoft.studio.preferences.BonitaThemeConstants; +import org.bonitasoft.studio.preferences.dialog.BonitaPreferenceDialog; +import org.eclipse.core.internal.databinding.beans.BeanPropertyHelper; +import org.eclipse.core.internal.resources.Workspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.InvalidRegistryObjectException; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.e4.core.contexts.ContextInjectionFactory; +import org.eclipse.e4.core.di.InjectionException; +import org.eclipse.e4.ui.css.swt.theme.IThemeEngine; +import org.eclipse.gmf.runtime.lite.svg.SVGFigure; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.m2e.core.MavenPlugin; +import org.eclipse.m2e.core.embedder.IMavenConfiguration; +import org.eclipse.m2e.core.repository.IRepository; +import org.eclipse.m2e.core.repository.IRepositoryRegistry; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IStartup; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.application.IWorkbenchConfigurer; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchAdvisor; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; +import org.eclipse.ui.contexts.IContextService; +import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.internal.Workbench; +import org.eclipse.ui.internal.browser.WebBrowserUtil; +import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages; +import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; +import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; +import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog; +import org.osgi.framework.Bundle; + +import com.google.common.base.Joiner; + +public class BonitaStudioWorkbenchAdvisor extends WorkbenchAdvisor implements IStartup { + + private static final String AWT_DRAW_STRING_AS_IMAGE = "drawStringAsImage"; + + private final class PreShutdownStudio implements IRunnableWithProgress { + + @Override + public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + monitor.beginTask(Messages.shuttingDown, IProgressMonitor.UNKNOWN); + UIDesignerServerManager.getInstance().stop(); + Job.getJobManager().cancel(StartEngineJob.FAMILY); + executePreShutdownContribution(); + new ActiveOrganizationProvider().flush(); + if (BOSWebServerManager.getInstance().serverIsStarted() && BOSEngineManager.getInstance().isRunning()) { + BOSEngineManager.getInstance().stop(); + } + FileUtil.deleteDir(ProjectUtil.getBonitaStudioWorkFolder()); + deleteTomcatTempDir(); + monitor.done(); + } + + private void deleteTomcatTempDir() { + File tempDir = new File(ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString() + File.separator + + "tomcat" + File.separator + "server" + File.separator + "temp"); + if (tempDir.exists()) { + FileUtil.deleteDir(tempDir); + } + } + + private void executePreShutdownContribution() { + final IConfigurationElement[] elements = BonitaStudioExtensionRegistryManager.getInstance() + .getConfigurationElements( + "org.bonitasoft.studio.application.preshutdown"); //$NON-NLS-1$ + IPreShutdownContribution contrib = null; + for (final IConfigurationElement elem : elements) { + try { + contrib = (IPreShutdownContribution) elem.createExecutableExtension("class"); //$NON-NLS-1$ + contrib.execute(); + } catch (final CoreException e) { + BonitaStudioLog.error(e); + } + } + } + } + + private static final String FIRST_STARTUP = "firstStartup"; + + @Override + public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(final IWorkbenchWindowConfigurer configurer) { + return new BonitaStudioWorkbenchWindowAdvisor(configurer); + } + + @Override + public void initialize(final IWorkbenchConfigurer configurer) { + super.initialize(configurer); + configurer.setSaveAndRestore(true); + final IContextService contextService = PlatformUI.getWorkbench().getService(IContextService.class); + contextService.activateContext("org.bonitasoft.studio.context.id"); + initializeIDEImages(configurer); + } + + /** + * Workaround to load icons for Common Navigator component in a RCP + */ + private void initializeIDEImages(final IWorkbenchConfigurer configurer) { + IDE.registerAdapters(); + declareWorkbenchImages(); + } + + /******************************************************************** + * /!\ Copy-pasted from IDEWorkbenchAvisor.declareWorkbenchImages() * + * ****************************************************************** + * Declares all IDE-specific workbench images. This includes both "shared" + * images (named in {@link org.eclipse.ui.ide.IDE.SharedImages}) and internal images (named in + * {@link org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages}). + * + * @see IWorkbenchConfigurer#declareImage + */ + private void declareWorkbenchImages() { + + final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$ + final String PATH_ELOCALTOOL = ICONS_PATH + "elcl16/"; // Enabled //$NON-NLS-1$ + + // toolbar + // icons. + final String PATH_DLOCALTOOL = ICONS_PATH + "dlcl16/"; // Disabled //$NON-NLS-1$ + // //$NON-NLS-1$ + // toolbar + // icons. + final String PATH_ETOOL = ICONS_PATH + "etool16/"; // Enabled toolbar //$NON-NLS-1$ + // //$NON-NLS-1$ + // icons. + final String PATH_DTOOL = ICONS_PATH + "dtool16/"; // Disabled toolbar //$NON-NLS-1$ + // //$NON-NLS-1$ + // icons. + final String PATH_OBJECT = ICONS_PATH + "obj16/"; // Model object //$NON-NLS-1$ + // //$NON-NLS-1$ + // icons + final String PATH_WIZBAN = ICONS_PATH + "wizban/"; // Wizard //$NON-NLS-1$ + // //$NON-NLS-1$ + // icons + + // View icons + final String PATH_EVIEW = ICONS_PATH + "eview16/"; //$NON-NLS-1$ + + final Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH); + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC, PATH_ETOOL + + "build_exec.png", //$NON-NLS-1$ + false); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_HOVER, + PATH_ETOOL + "build_exec.png", false); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED, + PATH_DTOOL + "build_exec.png", false); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC, PATH_ETOOL + + "search_src.png", //$NON-NLS-1$ + false); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_HOVER, + PATH_ETOOL + "search_src.png", false); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_DISABLED, + PATH_DTOOL + "search_src.png", false); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_NEXT_NAV, PATH_ETOOL + + "next_nav.png", //$NON-NLS-1$ + false); + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV, PATH_ETOOL + + "prev_nav.png", //$NON-NLS-1$ + false); + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_NEWPRJ_WIZ, PATH_WIZBAN + + "newprj_wiz.png", //$NON-NLS-1$ + false); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ, + PATH_WIZBAN + "newfolder_wiz.png", false); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFILE_WIZ, PATH_WIZBAN + + "newfile_wiz.png", //$NON-NLS-1$ + false); + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTDIR_WIZ, + PATH_WIZBAN + "importdir_wiz.png", false); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTZIP_WIZ, + PATH_WIZBAN + "importzip_wiz.png", false); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTDIR_WIZ, + PATH_WIZBAN + "exportdir_wiz.png", false); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTZIP_WIZ, + PATH_WIZBAN + "exportzip_wiz.png", false); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ, + PATH_WIZBAN + "workset_wiz.png", false); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN + + "saveas_wiz.png", //$NON-NLS-1$ + false); + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG, PATH_WIZBAN + + "quick_fix.png", //$NON-NLS-1$ + false); + + declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT, + PATH_OBJECT + "prj_obj.png", true); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT + + "cprj_obj.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OPEN_MARKER, + PATH_ELOCALTOOL + "gotoobj_tsk.png", true); //$NON-NLS-1$ + + // Quick fix icons + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED, + PATH_ELOCALTOOL + "smartmode_co.png", true); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED, + PATH_DLOCALTOOL + "smartmode_co.png", true); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_WARNING, + PATH_OBJECT + "quickfix_warning_obj.png", true); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_FIXABLE_ERROR, + PATH_OBJECT + "quickfix_error_obj.png", true); //$NON-NLS-1$ + + // task objects + // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_HPRIO_TSK, + // PATH_OBJECT+"hprio_tsk.png"); + // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_MPRIO_TSK, + // PATH_OBJECT+"mprio_tsk.png"); + // declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LPRIO_TSK, + // PATH_OBJECT+"lprio_tsk.png"); + + declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_TASK_TSK, + PATH_OBJECT + "taskmrk_tsk.png", true); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_BKMRK_TSK, + PATH_OBJECT + "bkmrk_tsk.png", true); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_COMPLETE_TSK, PATH_OBJECT + + "complete_tsk.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_INCOMPLETE_TSK, PATH_OBJECT + + "incomplete_tsk.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM, PATH_OBJECT + + "welcome_item.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_BANNER, PATH_OBJECT + + "welcome_banner.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT + + "error_tsk.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT + + "warn_tsk.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT + + "info_tsk.png", //$NON-NLS-1$ + true); + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_LCL_FLAT_LAYOUT, PATH_ELOCALTOOL + + "flatLayout.png", //$NON-NLS-1$ + true); + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_LCL_HIERARCHICAL_LAYOUT, + PATH_ELOCALTOOL + "hierarchicalLayout.png", true); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY, + PATH_ETOOL + "problem_category.png", true); //$NON-NLS-1$ + + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW, + PATH_EVIEW + "problems_view.png", true); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_ERROR, + PATH_EVIEW + "problems_view_error.png", true); //$NON-NLS-1$ + declareWorkbenchImage(ideBundle, + IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEMS_VIEW_WARNING, + PATH_EVIEW + "problems_view_warning.png", true); //$NON-NLS-1$ + } + + /** + * Declares an IDE-specific workbench image. + * + * @param symbolicName + * the symbolic name of the image + * @param path + * the path of the image file; this path is relative to the base + * of the IDE plug-in + * @param shared + * true if this is a shared image, and + * false if this is not a shared image + * @see IWorkbenchConfigurer#declareImage + */ + private void declareWorkbenchImage(final Bundle ideBundle, final String symbolicName, + final String path, final boolean shared) { + final URL url = FileLocator.find(ideBundle, new Path(path), null); + final ImageDescriptor desc = ImageDescriptor.createFromURL(url); + getWorkbenchConfigurer().declareImage(symbolicName, desc, shared); + } + + @Override + public String getInitialWindowPerspectiveId() { + return null; + } + + @Override + public String getMainPreferencePageId() { + return "org.bonitasoft.studio.preferences.preferences.UIPreferencePage"; + } + + @Override + public void preStartup() { + // Initialize adapter factories and avoid deadlock at startup + ProcessDiagramEditorPlugin.getInstance().getItemProvidersAdapterFactory(); + try { + new InstallBonitaMavenArtifactsOperation(MavenPlugin.getMaven().getLocalRepository()).execute(); + } catch (CoreException e) { + BonitaStudioLog.error(e); + } + disableInternalWebBrowser(); + setSystemProperties(); + } + + protected void setSystemProperties() { + var instanceLocation = Platform.getInstanceLocation(); + if (instanceLocation != null) { + String workspaceLocation = new File(instanceLocation.getURL().getFile()).getPath(); + System.setProperty("bonita.tomcat.lib.dir", String.format("%s%stomcat%sserver%slib", workspaceLocation, + File.separator, File.separator, File.separator)); + BonitaStudioLog.info("bonita.tomcat.lib.dir=" + System.getProperty("bonita.tomcat.lib.dir"), + ApplicationPlugin.PLUGIN_ID); + } else { + BonitaStudioLog.warning("Property 'bonita.tomcat.lib.dir' has not been set.", ApplicationPlugin.PLUGIN_ID); + } + // Workaround for STUDIO-3651 + System.setProperty(AWT_DRAW_STRING_AS_IMAGE, System.getProperty(AWT_DRAW_STRING_AS_IMAGE, "true")); + } + + @Override + public void postStartup() { + var initializeProjectJob = new Job("Initialize project") { + + @Override + protected IStatus run(IProgressMonitor monitor) { + RepositoryManager.getInstance().getAccessor().start(monitor); + return Status.OK_STATUS; + } + }; + initializeProjectJob.addJobChangeListener(new JobChangeAdapter() { + + @Override + public void done(IJobChangeEvent event) { + if (initializeProjectJob.equals(event.getJob())) { + executePostStartupContributions(); + } + super.done(event); + } + }); + initializeProjectJob.setPriority(Job.INTERACTIVE); + initializeProjectJob.schedule(); + + super.postStartup(); + IThemeEngine engine = PlatformUI.getWorkbench().getService(IThemeEngine.class); + synchroniseTheme(engine); + applyTheme(engine); + } + + /** + * Synchronise active eclipse theme with the Bonita preference, + * to ensure that specifics adjustments for Dark theme are applied. + * The preference value can be outdated if the user update the theme from the eclipse preference panel. + */ + private void synchroniseTheme(IThemeEngine engine) { + String currentValue = BonitaStudioPreferencesPlugin.getDefault().getPreferenceStore() + .getString(BonitaThemeConstants.STUDIO_THEME_PREFERENCE); + String activeTheme = engine.getActiveTheme() == null + ? null + : engine.getActiveTheme().getId(); + if (!themeIsValid(activeTheme)) { + BonitaStudioPreferencesPlugin.getDefault().getPreferenceStore() + .setValue(BonitaThemeConstants.STUDIO_THEME_PREFERENCE, BonitaThemeConstants.LIGHT_THEME); + } else if (!Objects.equals(currentValue, engine.getActiveTheme().getId())) { + BonitaStudioPreferencesPlugin.getDefault().getPreferenceStore() + .setValue(BonitaThemeConstants.STUDIO_THEME_PREFERENCE, engine.getActiveTheme().getId()); + } + } + + private boolean themeIsValid(String themeId) { + if (themeId != null && !themeId.isBlank()) { + return Objects.equals(themeId, BonitaThemeConstants.LIGHT_THEME) + || Objects.equals(themeId, BonitaThemeConstants.DARK_THEME); + } + return false; + } + + /** + * Apply the theme if required (usually on first start). + */ + private void applyTheme(IThemeEngine engine) { + String expectedTheme = BonitaStudioPreferencesPlugin.getDefault().getPreferenceStore() + .getString(BonitaThemeConstants.STUDIO_THEME_PREFERENCE); + if (engine.getActiveTheme() == null + || !Objects.equals(expectedTheme, engine.getActiveTheme().getId())) { + BonitaStudioLog.info(String.format("Applying theme %s", expectedTheme), ApplicationPlugin.PLUGIN_ID); + engine.setTheme(expectedTheme, true); + } + } + + /** + * Disconnect from the core workspace. + */ + private void disconnectFromWorkspace(final IProgressMonitor monitor) { + // save the workspace + final MultiStatus status = new MultiStatus( + IDEWorkbenchPlugin.IDE_WORKBENCH, 1, + IDEWorkbenchMessages.ProblemSavingWorkbench, null); + try { + final ProgressMonitorJobsDialog p = new ProgressMonitorJobsDialog( + null); + + final boolean applyPolicy = ResourcesPlugin.getWorkspace() + .getDescription().isApplyFileStatePolicy(); + + final IRunnableWithProgress runnable = new IRunnableWithProgress() { + + @Override + public void run(final IProgressMonitor monitor) { + try { + if (applyPolicy) { + status.merge(((Workspace) ResourcesPlugin + .getWorkspace()).save(true, true, monitor)); + } + } catch (final CoreException e) { + status.merge(e.getStatus()); + } + } + }; + p.run(true, false, runnable); + } catch (final InvocationTargetException e) { + status + .merge(new Status(IStatus.ERROR, + IDEWorkbenchPlugin.IDE_WORKBENCH, 1, + IDEWorkbenchMessages.InternalError, e + .getTargetException())); + } catch (final InterruptedException e) { + status.merge(new Status(IStatus.ERROR, + IDEWorkbenchPlugin.IDE_WORKBENCH, 1, + IDEWorkbenchMessages.InternalError, e)); + } + ErrorDialog.openError(null, + IDEWorkbenchMessages.ProblemsSavingWorkspace, null, status, + IStatus.ERROR | IStatus.WARNING); + if (!status.isOK()) { + IDEWorkbenchPlugin.log( + IDEWorkbenchMessages.ProblemsSavingWorkspace, status); + } + } + + protected void disableInternalWebBrowser() { + final String noRegister = System.getProperty("bonita.noregister"); //$NON-NLS-1$ + if (noRegister == null || !noRegister.equals("1")) { + WebBrowserUtil.isInternalBrowserOperational = false; + } + } + + @Override + public void postShutdown() { + super.postShutdown(); + disconnectFromWorkspace(AbstractRepository.NULL_PROGRESS_MONITOR); + } + + @Override + public boolean preShutdown() { + IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getActivePage(); + Stream.of(activePage.getViewReferences()) + .filter(vr -> Objects.equals("org.eclipse.ui.browser.view", vr.getId())) + .forEach(activePage::hideView); + Job.getJobManager().cancel(StartEngineJob.FAMILY); + final boolean returnValue = super.preShutdown(); + if (returnValue) { + try { + if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null + && PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null) { + PlatformUI.getWorkbench().getProgressService().run(true, false, new PreShutdownStudio()); + return true; + } + } catch (final Exception e) { + BonitaStudioLog.error(e); + } + } + return returnValue; + } + + @Override + public void earlyStartup() { + if (PlatformUtil.isHeadless()) { + return;//Do not execute earlyStartup in headless mode + } + + new Job("Setup internal maven repository") { + + @Override + protected IStatus run(IProgressMonitor monitor) { + new InstallBonitaMavenArtifactsOperation(MavenRepositories.internalRepository()).execute(); + try { + testMavenCentralAccess(monitor); + } catch (InvocationTargetException | InterruptedException e) { + return new Status(IStatus.ERROR, getClass(), e.getMessage()); + } + return Status.OK_STATUS; + } + + private void testMavenCentralAccess(IProgressMonitor monitor) + throws InvocationTargetException, InterruptedException { + // Use an arbitrary artifact (small) to test maven central access + var operation = new DependencyGetOperation( + new GAV("org.bonitasoft.engine", "bonita-engine", "7.13.0", null, "pom", null)); + MavenPlugin.getRepositoryRegistry().getRepositories(IRepositoryRegistry.SCOPE_SETTINGS).stream() + .map(IRepository::getUrl) + .forEach(operation::addRemoteRespository); + operation.run(monitor); + var result = operation.getResult(); + if (result == null) { + IMavenConfiguration mavenConfiguration = MavenPlugin.getMavenConfiguration(); + var userSettingsFile = mavenConfiguration.getUserSettingsFile() != null + ? new File(mavenConfiguration.getUserSettingsFile()) + : SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE; + Display.getDefault().syncExec(() -> { + var message = Messages.cannotReachMavenCentralRepositoryMessage; + if (userSettingsFile.exists()) { + message = message + System.lineSeparator() + + String.format(Messages.validateExistingMavenConfigurationMessage, + userSettingsFile.getAbsolutePath()); + } + int buttonId = new MessageDialogWithLink(Display.getDefault().getActiveShell(), + Messages.cannotReachMavenCentralRepositoryTitle, + null, + message, + MessageDialog.WARNING, + new String[] { IDialogConstants.IGNORE_LABEL, + Messages.retry, + Messages.configure }, + 0, + URI.create(RedirectURLBuilder.create("728"))).open(); + if (buttonId == 2) { + BonitaPreferenceDialog dialog = new BonitaPreferenceDialog( + new Shell(Display.getDefault())); + dialog.create(); + dialog.setSelectedPreferencePage(BonitaPreferenceDialog.MAVEN_PAGE_ID); + dialog.open(); + try { + testMavenCentralAccess(monitor); + } catch (InvocationTargetException | InterruptedException e) { + BonitaStudioLog.error(e); + } + } else if (buttonId == 1) { + try { + testMavenCentralAccess(monitor); + } catch (InvocationTargetException | InterruptedException e) { + BonitaStudioLog.error(e); + } + } + }); + } + } + }.schedule(); + + preLoad(); + + final long startupDuration = System.currentTimeMillis() - BonitaStudioApplication.START_TIME; + BonitaStudioLog.info("Startup duration : " + DateUtil.getDisplayDuration(startupDuration), + ApplicationPlugin.PLUGIN_ID); + ApplicationPlugin.getDefault().getPreferenceStore().setDefault(FIRST_STARTUP, true); + if (isFirstStartup()) { +// new OpenReleaseNoteHandler().openBrowser(); +// PlatformUtil.openIntroIfNoOtherEditorOpen(); +// }else { + PlatformUtil.openDashboardIfNoOtherEditorOpen(); + } + ApplicationPlugin.getDefault().getPreferenceStore().setValue(FIRST_STARTUP, false); + } + + private void executePostStartupContributions() { + final IConfigurationElement[] elements = BonitaStudioExtensionRegistryManager.getInstance() + .getConfigurationElements( + "org.bonitasoft.studio.common.poststartup"); //$NON-NLS-1$ + for (final IConfigurationElement elem : elements) { + final Workbench workbench = (Workbench) PlatformUI.getWorkbench(); + try { + IPostStartupContribution contrib = (IPostStartupContribution) ContextInjectionFactory + .make(Platform.getBundle(elem.getDeclaringExtension().getNamespaceIdentifier()) + .loadClass(elem.getAttribute("class")), workbench.getContext()); + Display.getDefault().asyncExec(contrib::execute); + } catch (InjectionException | ClassNotFoundException | InvalidRegistryObjectException e) { + BonitaStudioLog.error(e); + } + } + } + + private boolean isFirstStartup() { + return ApplicationPlugin.getDefault().getPreferenceStore().getBoolean(FIRST_STARTUP); + } + + private void preLoad() { + //Fix performance issue + BeanPropertyHelper.getPropertyDescriptor(ContractInputImpl.class, "name"); + preLoadSVG(); + } + + private void preLoadSVG() { + final SVGFigure svgFigure = new SVGFigure(); + try { + final File iconsFolder = new File( + FileLocator.toFileURL(Platform.getBundle("org.bonitasoft.studio.pics").getResource("icons")) + .getFile()); + initSVGFigure(svgFigure, iconsFolder, "figures"); + initSVGFigure(svgFigure, iconsFolder, "decoration", "svg"); + } catch (final IOException e) { + BonitaStudioLog.error(e); + } + } + + private void initSVGFigure(final SVGFigure svgFigure, final File iconsFolder, final String... pathToFolder) { + for (final String filename : new File(iconsFolder, Joiner.on(File.separatorChar).join(pathToFolder)).list()) { + if (filename.endsWith(".svgz")) { + svgFigure + .setURI("platform:/plugin/org.bonitasoft.studio.pics/icons/" + Joiner.on("/").join(pathToFolder) + + "/" + filename); + } + } + } + +} diff --git a/bundles.plugins.application.src.org.bonitasoft.studio.application.actions.OpenIntroCommandHnadler.java b/bundles.plugins.application.src.org.bonitasoft.studio.application.actions.OpenIntroCommandHnadler.java new file mode 100644 index 0000000..31d9ae0 --- /dev/null +++ b/bundles.plugins.application.src.org.bonitasoft.studio.application.actions.OpenIntroCommandHnadler.java @@ -0,0 +1,32 @@ +/** + * Copyright (C) 2010 BonitaSoft S.A. + * BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2.0 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.bonitasoft.studio.application.actions; + +import org.bonitasoft.studio.common.platform.tools.PlatformUtil; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +public class OpenIntroCommandHandler extends AbstractHandler { + + public Object execute(ExecutionEvent event) throws ExecutionException { +/* PlatformUtil.openIntro();*/ + return null; + } + +} diff --git a/bundles.plugins.application.src.org.bonitasoft.studio.application.coolbar.WelcomeCoolbarItem.java b/bundles.plugins.application.src.org.bonitasoft.studio.application.coolbar.WelcomeCoolbarItem.java new file mode 100644 index 0000000..949985b --- /dev/null +++ b/bundles.plugins.application.src.org.bonitasoft.studio.application.coolbar.WelcomeCoolbarItem.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2012 BonitaSoft S.A. + * BonitaSoft, 31 rue Gustave Eiffel - 38000 Grenoble + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2.0 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.bonitasoft.studio.application.coolbar; + +import org.bonitasoft.studio.application.actions.OpenIntroCommandHandler; +import org.bonitasoft.studio.application.i18n.Messages; +import org.bonitasoft.studio.common.extension.IBonitaContributionItem; +import org.bonitasoft.studio.common.log.BonitaStudioLog; +import org.bonitasoft.studio.pics.Pics; +import org.bonitasoft.studio.pics.PicsConstants; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.action.ContributionItem; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + +/** + * @author Romain Bioteau + */ +public class WelcomeCoolbarItem extends ContributionItem implements IBonitaContributionItem { +/* + private final OpenIntroCommandHandler handler; + + public WelcomeCoolbarItem() { + handler = new OpenIntroCommandHandler(); + } +*/ + /* + * (non-Javadoc) + * @see org.eclipse.jface.action.IContributionItem#getId() + */ +/* @Override + public String getId() { + return "org.bonitasoft.studio.coolbar.welcome"; + } + + @Override + public String getText() { + return Messages.WelcomeButtonLabel; + } + + @Override + public void fill(final ToolBar toolbar, final int index, final int iconSize) { + final ToolItem item = new ToolItem(toolbar, SWT.PUSH | SWT.RIGHT); + item.setToolTipText(Messages.WelcomeButtonLabel); + if (iconSize < 0) { + item.setImage(Pics.getImage(PicsConstants.coolbar_welcome_32)); + item.setHotImage(Pics.getImage(PicsConstants.coolbar_welcome_hot_32)); + } else { + item.setImage(Pics.getImage(PicsConstants.coolbar_welcome_24)); + item.setHotImage(Pics.getImage(PicsConstants.coolbar_welcome_hot_24)); + } + item.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(final SelectionEvent e) { + try { + handler.execute(new ExecutionEvent()); + } catch (final ExecutionException e1) { + BonitaStudioLog.error(e1); + } + } + }); + + } +*/ +} diff --git a/bundles.plugins.engine.plugin.xml b/bundles.plugins.engine.plugin.xml new file mode 100644 index 0000000..0d514c1 --- /dev/null +++ b/bundles.plugins.engine.plugin.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles.plugins.engine.src.org.bonitasoft.studio.engine.BOSEngineManager.java b/bundles.plugins.engine.src.org.bonitasoft.studio.engine.BOSEngineManager.java new file mode 100644 index 0000000..6bbc649 --- /dev/null +++ b/bundles.plugins.engine.src.org.bonitasoft.studio.engine.BOSEngineManager.java @@ -0,0 +1,446 @@ +/** + * Copyright (C) 2012-2015 Bonitasoft S.A. + * Bonitasoft, 32 rue Gustave Eiffel - 38000 Grenoble + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2.0 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.bonitasoft.studio.engine; + +import static java.util.Objects.requireNonNull; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import org.bonitasoft.engine.api.ApplicationAPI; +import org.bonitasoft.engine.api.CommandAPI; +import org.bonitasoft.engine.api.IdentityAPI; +import org.bonitasoft.engine.api.LoginAPI; +import org.bonitasoft.engine.api.PageAPI; +import org.bonitasoft.engine.api.PlatformAPI; +import org.bonitasoft.engine.api.PlatformAPIAccessor; +import org.bonitasoft.engine.api.ProcessAPI; +import org.bonitasoft.engine.api.ProfileAPI; +import org.bonitasoft.engine.api.TenantAPIAccessor; +import org.bonitasoft.engine.api.TenantAdministrationAPI; +import org.bonitasoft.engine.exception.BonitaHomeNotSetException; +import org.bonitasoft.engine.exception.ServerAPIException; +import org.bonitasoft.engine.exception.UnknownAPITypeException; +import org.bonitasoft.engine.exception.UpdateException; +import org.bonitasoft.engine.platform.LoginException; +import org.bonitasoft.engine.platform.PlatformLoginException; +import org.bonitasoft.engine.platform.PlatformLogoutException; +import org.bonitasoft.engine.session.APISession; +import org.bonitasoft.engine.session.PlatformSession; +import org.bonitasoft.engine.session.SessionNotFoundException; +import org.bonitasoft.studio.common.CommandExecutor; +import org.bonitasoft.studio.common.extension.BonitaStudioExtensionRegistryManager; +import org.bonitasoft.studio.common.log.BonitaStudioLog; +import org.bonitasoft.studio.common.repository.AbstractRepository; +import org.bonitasoft.studio.common.repository.RepositoryManager; +import org.bonitasoft.studio.common.repository.extension.IEngineAction; +import org.bonitasoft.studio.common.repository.model.IRepository; +import org.bonitasoft.studio.engine.export.BarExporter; +import org.bonitasoft.studio.engine.i18n.Messages; +import org.bonitasoft.studio.engine.preferences.EnginePreferenceConstants; +import org.bonitasoft.studio.model.configuration.Configuration; +import org.bonitasoft.studio.model.process.AbstractProcess; +import org.bonitasoft.studio.preferences.dialog.BonitaPreferenceDialog; +import org.bonitasoft.studio.ui.notification.BonitaNotificator; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +/** + * @author Romain Bioteau + */ +public class BOSEngineManager { + + public static final String CUSTOM_PERMISSIONS_MAPPING_PROPERTIES = "custom-permissions-mapping.properties"; + + public static final String CONSOLE_CONFIG_PROPERTIES = "console-config.properties"; + + private static final String POSTSTARTUP_CONTIBUTION_ID = "org.bonitasoft.studio.engine.postEngineAction"; + + public static final String PLATFORM_PASSWORD = "platform"; + + public static final String PLATFORM_USER = "platformAdmin"; + + public static final String BONITA_TECHNICAL_USER = "install"; + + public static final String BONITA_TECHNICAL_USER_PASSWORD = "install"; + + public static final String API_TYPE_PROPERTY_NAME = "org.bonitasoft.engine.api-type"; + + public static final String DEFAULT_TENANT_NAME = "default"; + + public static final String DEFAULT_TENANT_DESC = "The default tenant created by the Studio"; + + private static final String ENGINESERVERMANAGER_EXTENSION_D = "org.bonitasoft.studio.engine.bonitaEngineManager"; + + private static final long DEFAULT_TENANT_ID = 1; + + public static final String SECURITY_CONFIG_PROPERTIES = "security-config.properties"; + + private static final String FIND_USER_PASSWORD_COMMAND = "org.bonitasoft.studio.actors.command.userPassword"; + + private static BOSEngineManager INSTANCE; + + private boolean isRunning = false; + + private IProgressMonitor monitor; + + private CommandExecutor commandExecutor = new CommandExecutor(); + + protected BOSEngineManager(final IProgressMonitor monitor) { + if (monitor == null) { + this.monitor = AbstractRepository.NULL_PROGRESS_MONITOR; + } else { + this.monitor = monitor; + } + } + + public static BOSEngineManager getInstance() { + return getInstance(null); + } + + public static synchronized BOSEngineManager getInstance(final IProgressMonitor monitor) { + if (INSTANCE == null) { + INSTANCE = createInstance(monitor); + } + return INSTANCE; + } + + protected static BOSEngineManager createInstance(final IProgressMonitor monitor) { + for (final IConfigurationElement element : BonitaStudioExtensionRegistryManager.getInstance() + .getConfigurationElements(ENGINESERVERMANAGER_EXTENSION_D)) { + try { + return (BOSEngineManager) element.createExecutableExtension("class"); + } catch (final CoreException e) { + BonitaStudioLog.error(e, EnginePlugin.PLUGIN_ID); + } + } + + return new BOSEngineManager(monitor); + } + + public synchronized void start(AbstractRepository repository) { + if (!isRunning() || !BOSWebServerManager.getInstance().serverIsStarted()) { +// boolean notifying = notifyStartServer(); +// monitor.beginTask(Messages.initializingProcessEngine, IProgressMonitor.UNKNOWN); +// BOSWebServerManager.getInstance().startServer(repository, monitor); +// isRunning = postEngineStart(repository); +// if (notifying) { +// notifyServerStarted(); +// } + } + } + + private boolean notifyStartServer() { + if (EngineNotificationSemaphore.getInstance().tryAcquire()) { + if (!isLazyModeEnabled(EnginePlugin.getDefault().getPreferenceStore())) { + BonitaNotificator.openNotification(Messages.startServerNotificationTitle, + Messages.engineLazyModeNotificationLink, e -> { + BonitaPreferenceDialog dialog = new BonitaPreferenceDialog(new Shell(Display.getDefault())); + dialog.create(); + dialog.setSelectedPreferencePage(BonitaPreferenceDialog.SERVER_SETTINGS_PAGE_ID); + dialog.open(); + }); + } + return true; + } + return false; + } + + private boolean isLazyModeEnabled(IPreferenceStore preferenceStore) { + return preferenceStore.getBoolean(EnginePreferenceConstants.LAZYLOAD_ENGINE) + || System.getProperty(EnginePreferenceConstants.LAZYLOAD_ENGINE) != null; + } + + public synchronized void start() { + start(RepositoryManager.getInstance().getCurrentRepository()); + } + + protected boolean postEngineStart(IRepository repository) { + //RESUME ENGINE IF PAUSED AT STARTUP + try { + final APISession apiSession = getLoginAPI().login(BONITA_TECHNICAL_USER, BONITA_TECHNICAL_USER_PASSWORD); + final TenantAdministrationAPI tenantManagementAPI = getTenantAdministrationAPI(apiSession); + if (tenantManagementAPI.isPaused()) { + tenantManagementAPI.resume(); + } + executePostStartupContributions(repository); + } catch (final Exception e) { + return handlePostEngineStartException(e); + } + return true; + } + + private void notifyServerStarted() { + BonitaNotificator.openNotification(Messages.startServerCompletedNotificationTitle, + Messages.serverRunningNotificationMessage); + EngineNotificationSemaphore.getInstance().release(); + } + + private boolean handlePostEngineStartException(final Exception e) { + if (tomcatServerIsRunning()) { + BonitaStudioLog.error(e); + } else { + BonitaStudioLog.warning("Tomcat server has been shutdown before first start ended.", EnginePlugin.PLUGIN_ID); + } + return false; + } + + protected boolean tomcatServerIsRunning() { + return BOSWebServerManager.getInstance().serverIsStarted(); + } + + public synchronized void stop() { + APISession session = null; + TenantAdministrationAPI tenantManagementAPI = null; + try { + session = loginDefaultTenant(null); + tenantManagementAPI = getTenantAdministrationAPI(session); + tenantManagementAPI.pause(); + if (dropBusinessDataDBOnExit()) { + tenantManagementAPI.cleanAndUninstallBusinessDataModel(); + } else { + tenantManagementAPI.uninstallBusinessDataModel(); + } + tenantManagementAPI.resume(); + } catch (final Exception e) { + BonitaStudioLog.error(e); + } finally { + if (tenantManagementAPI != null && tenantManagementAPI.isPaused()) { + try { + tenantManagementAPI.resume(); + } catch (final UpdateException e) { + BonitaStudioLog.error(e); + } + } + if (session != null) { + logoutDefaultTenant(session); + } + } + if (BOSWebServerManager.getInstance().serverIsStarted()) { + BOSWebServerManager.getInstance().stopServer(monitor); + } + isRunning = false; + try { + BOSWebServerManager.getInstance().cleanBeforeShutdown(); + } catch (final IOException e) { + BonitaStudioLog.error(e); + } + } + + private boolean dropBusinessDataDBOnExit() { + final IPreferenceStore preferenceStore = EnginePlugin.getDefault().getPreferenceStore(); + return preferenceStore.getBoolean(EnginePreferenceConstants.DROP_BUSINESS_DATA_DB_ON_EXIT_PREF); + } + + protected void executePostStartupContributions(IRepository repository) throws Exception { + final IConfigurationElement[] elements = BonitaStudioExtensionRegistryManager.getInstance() + .getConfigurationElements(POSTSTARTUP_CONTIBUTION_ID); + IEngineAction contrib = null; + for (final IConfigurationElement elem : elements) { + try { + contrib = (IEngineAction) elem.createExecutableExtension("class"); //$NON-NLS-1$ + } catch (final CoreException e) { + BonitaStudioLog.error(e); + } + if (contrib != null && contrib.shouldRun(repository)) { + final APISession session = getLoginAPI().login(BONITA_TECHNICAL_USER, BONITA_TECHNICAL_USER_PASSWORD); + try { + contrib.run(session,repository); + } finally { + if (session != null) { + logoutDefaultTenant(session); + } + } + } + } + + } + + public boolean isRunning() { + return isRunning; + } + + public ProcessAPI getProcessAPI(final APISession session) { + try { + return TenantAPIAccessor.getProcessAPI(session); + } catch (final Exception e) { + BonitaStudioLog.error(e); + } + return null; + } + + protected LoginAPI getLoginAPI() throws BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { + return TenantAPIAccessor.getLoginAPI(); + } + + public APISession loginDefaultTenant(final IProgressMonitor monitor) + throws LoginException, BonitaHomeNotSetException, ServerAPIException, + UnknownAPITypeException { + return loginTenant(BONITA_TECHNICAL_USER, BONITA_TECHNICAL_USER_PASSWORD, monitor); + } + + public APISession loginTenant(final String login, final String password, final IProgressMonitor monitor) + throws LoginException, + BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { + if (!isRunning() && monitor != null) { + monitor.beginTask(Messages.waitingForEngineToStart, IProgressMonitor.UNKNOWN); + } + start(); + BonitaStudioLog.debug("Attempt to login as " + login, EnginePlugin.PLUGIN_ID); + final APISession session = getLoginAPI().login(requireNonNull(login), requireNonNull(password)); + if (session != null) { + BonitaStudioLog.debug("Login successful.", EnginePlugin.PLUGIN_ID); + } + return session; + } + + public void logoutDefaultTenant(final APISession session) { + try { + getLoginAPI().logout(session); + } catch (final Exception e) { + BonitaStudioLog.error(e); + } + } + + public IdentityAPI getIdentityAPI(final APISession session) + throws BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { + return TenantAPIAccessor.getIdentityAPI(session); + } + + public CommandAPI getCommandAPI(final APISession session) + throws BonitaHomeNotSetException, ServerAPIException, + UnknownAPITypeException { + return TenantAPIAccessor.getCommandAPI(session); + } + + public ProfileAPI getProfileAPI(final APISession session) + throws BonitaHomeNotSetException, ServerAPIException, + UnknownAPITypeException { + return TenantAPIAccessor.getProfileAPI(session); + } + + public PageAPI getPageAPI(final APISession session) + throws BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { + return TenantAPIAccessor.getCustomPageAPI(session); + } + + public ApplicationAPI getApplicationAPI(final APISession session) + throws BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { + return TenantAPIAccessor.getLivingApplicationAPI(session); + } + + public TenantAdministrationAPI getTenantAdministrationAPI(final APISession session) + throws BonitaHomeNotSetException, + ServerAPIException, UnknownAPITypeException { + return TenantAPIAccessor.getTenantAdministrationAPI(session); + } + + public PlatformSession loginPlatform(IProgressMonitor monitor) + throws PlatformLoginException, BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { + if (!isRunning() && monitor != null) { + monitor.beginTask(Messages.waitingForEngineToStart, IProgressMonitor.UNKNOWN); + } + start(); + return PlatformAPIAccessor.getPlatformLoginAPI().login(PLATFORM_USER, PLATFORM_PASSWORD); + } + + public void logoutPlatform(PlatformSession session) + throws PlatformLogoutException, SessionNotFoundException, BonitaHomeNotSetException, ServerAPIException, + UnknownAPITypeException { + PlatformAPIAccessor.getPlatformLoginAPI().logout(session); + } + + public PlatformAPI getPlatformAPI(PlatformSession session) + throws BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException { + return PlatformAPIAccessor.getPlatformAPI(session); + } + + public APISession createSession(final AbstractProcess process, final String configurationId, + final IProgressMonitor monitor) throws Exception { + final Configuration configuration = BarExporter.getInstance().getConfiguration(process, configurationId); + APISession session; + String username = configuration.getUsername(); + String password = retrieveUserPasswordFromActiveOrga(username) + .orElseThrow(() -> new Exception( + String.format("Unable to retrieve the password of %s in the active organization.", + username))); + try { + session = BOSEngineManager.getInstance().loginTenant(username, password, + monitor); + } catch (final Exception e1) { + throw new Exception(Messages.bind(Messages.loginFailed, + new String[] { username, process.getName(), + process.getVersion() }), + e1); + } + if (session == null) { + throw new Exception(Messages.bind(Messages.loginFailed, + new String[] { username, process.getName(), + process.getVersion() })); + } + return session; + } + + private Optional retrieveUserPasswordFromActiveOrga(String user) { + Map parameters = new HashMap<>(); + parameters.put("userName", user); + Object result = commandExecutor.executeCommand(FIND_USER_PASSWORD_COMMAND, parameters); + return result instanceof Optional ? (Optional) result : Optional.empty(); + } + + public byte[] getTenantConfigResourceContent(String resourceName, IProgressMonitor monitor) + throws PlatformLoginException, BonitaHomeNotSetException, ServerAPIException, UnknownAPITypeException, + PlatformLogoutException, SessionNotFoundException, FileNotFoundException { + PlatformSession loginPlatform = null; + try { + loginPlatform = loginPlatform(monitor); + final PlatformAPI platformAPI = getPlatformAPI(loginPlatform); + final Map> clientTenantConfigurations = platformAPI.getClientTenantConfigurations(); + final Map resources = clientTenantConfigurations.get(DEFAULT_TENANT_ID); + if (!resources.containsKey(resourceName)) { + throw new FileNotFoundException(String.format("Resource %s does not exist in database.", resourceName)); + } + return resources.get(resourceName); + } finally { + if (loginPlatform != null) { + logoutPlatform(loginPlatform); + } + } + } + + public void updateTenantConfigResourceContent(String resourceName, byte[] content) + throws PlatformLoginException, BonitaHomeNotSetException, + ServerAPIException, UnknownAPITypeException, + UpdateException, PlatformLogoutException, SessionNotFoundException { + PlatformSession loginPlatform = null; + try { + loginPlatform = loginPlatform(null); + final PlatformAPI platformAPI = getPlatformAPI(loginPlatform); + platformAPI.updateClientTenantConfigurationFile(DEFAULT_TENANT_ID, resourceName, content); + } finally { + if (loginPlatform != null) { + logoutPlatform(loginPlatform); + } + } + } + +} diff --git a/bundles.plugins.intro.content.introContent.xml b/bundles.plugins.intro.content.introContent.xml new file mode 100644 index 0000000..71cafc4 --- /dev/null +++ b/bundles.plugins.intro.content.introContent.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/bundles.plugins.intro.content.welcome.html b/bundles.plugins.intro.content.welcome.html new file mode 100644 index 0000000..c8631cf --- /dev/null +++ b/bundles.plugins.intro.content.welcome.html @@ -0,0 +1,151 @@ + + + + +Welcome + + + + + + +
+
+
+
+ + +
    +
  • +
  • +
  • +
  • +
+
+
+
+
+ + + +
+
+ +
+
+ + +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+ + +
    +
  • +
  • +
  • +
+
+
+
+
+ + +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+ + + diff --git a/bundles.plugins.intro.plugin.properties b/bundles.plugins.intro.plugin.properties new file mode 100644 index 0000000..1c6ee78 --- /dev/null +++ b/bundles.plugins.intro.plugin.properties @@ -0,0 +1 @@ +openWelcomePage_label=Welcome to Japan Digital Studio diff --git a/bundles.plugins.intro.plugin.xml b/bundles.plugins.intro.plugin.xml new file mode 100644 index 0000000..a30d19d --- /dev/null +++ b/bundles.plugins.intro.plugin.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + diff --git a/bundles.plugins.pom.xml b/bundles.plugins.pom.xml new file mode 100644 index 0000000..853fcf3 --- /dev/null +++ b/bundles.plugins.pom.xml @@ -0,0 +1,151 @@ + + + 4.0.0 + + org.bonitasoft.studio + bundles + 7.13.0 + + Bonita Studio Community Plugins + org.bonitasoft.studio.bundles + plugins + pom + + + + bonita-business-data-generator + bonita-studio-watchdog + org.bonitasoft.studio-models + org.bonitasoft.studio.application + org.bonitasoft.studio.console.libs + org.bonitasoft.studio.model + org.bonitasoft.studio.model.edit + org.bonitasoft.studio.tests-utils + org.bonitasoft.studio.diagram + org.bonitasoft.studio.businessobject + org.bonitasoft.studio.common + org.bonitasoft.studio.common.diagram + org.bonitasoft.studio.common.repository + org.bonitasoft.studio.contract + org.bonitasoft.studio.configuration + + org.bonitasoft.studio.connectors + org.bonitasoft.studio.connectors.model + org.bonitasoft.studio.connectors.model.edit + org.bonitasoft.studio.data + org.bonitasoft.studio.datatools + org.bonitasoft.studio.decision.table + org.bonitasoft.studio.dependencies + org.bonitasoft.studio.designer + org.bonitasoft.studio.designer.linux + org.bonitasoft.studio.designer.macosx + org.bonitasoft.studio.designer.war + org.bonitasoft.studio.designer.win32 + org.bonitasoft.studio.diagram.custom + org.bonitasoft.studio.document + org.bonitasoft.studio.engine + org.bonitasoft.studio.exporter + org.bonitasoft.studio.expression.editor + org.bonitasoft.studio.groovy + org.bonitasoft.studio.groovy.ui + org.bonitasoft.studio.identity + org.bonitasoft.studio.importer + org.bonitasoft.studio.importer.bos + org.bonitasoft.studio.intro + org.bonitasoft.studio.la + org.bonitasoft.studio.migration + org.bonitasoft.studio.model.edit.custom + org.bonitasoft.studio.refactoring + org.bonitasoft.studio.parameters + org.bonitasoft.studio.pics + org.bonitasoft.studio.pics.bonitasoft + org.bonitasoft.studio.preferences + org.bonitasoft.studio.properties + org.bonitasoft.studio.rest.api.extension + org.bonitasoft.studio.sap.dependency + org.bonitasoft.studio.sap.mock + org.bonitasoft.studio.scripting + org.bonitasoft.studio.sqlbuilder.ex + org.bonitasoft.studio.team + org.bonitasoft.studio.team.git + org.bonitasoft.studio.ui + org.bonitasoft.studio.validation + org.bonitasoft.studio.validation.common + org.bonitasoft.studio.xml + org.omg.schema.spec.bpmn + org.bonitasoft.studio-product + + + + + junit + junit + test + + + + + src-test/java + + + src-test/resources + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + default-test + test + + + ignore + + + **/*Test.java + + + + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-testCompile + test-compile + + testCompile + + + + + + + + + + local-repository + + true + + + org.bonitasoft.studio.local.repository + + + + + diff --git a/bundles.plugins.studio-product.plugin.xml b/bundles.plugins.studio-product.plugin.xml new file mode 100644 index 0000000..a647b3e --- /dev/null +++ b/bundles.plugins.studio-product.plugin.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/console.libs.build.properties b/console.libs.build.properties new file mode 100644 index 0000000..161fa3b --- /dev/null +++ b/console.libs.build.properties @@ -0,0 +1,4 @@ +bin.includes = META-INF/,\ + .,\ + lib/\ + diff --git a/console.libs.pom.xml b/console.libs.pom.xml new file mode 100644 index 0000000..5c0342f --- /dev/null +++ b/console.libs.pom.xml @@ -0,0 +1,255 @@ + + + 4.0.0 + + org.bonitasoft.studio.bundles + plugins + 7.13.0 + + org.bonitasoft.studio.bundles.plugins + org.bonitasoft.studio.console.libs + eclipse-plugin + + + ${basedir}/tomcat + lib + + + + + org.bonitasoft.engine + bonita-client + ${engine.version} + + + javax.xml.bind + jsr173_api + + + + + org.bonitasoft.engine + bonita-common + ${engine.version} + + + javax.xml.bind + jsr173_api + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + parse-version + + parse-version + + + + regex-property + + regex-property + + + osgiVersion + ${parsedVersion.osgiVersion} + .SNAPSHOT + .qualifier + false + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + + Retrieve bonita-client dependencies + process-sources + + copy-dependencies + + + true + true + ${lib.dir} + true + true + true + runtime + + + + + + maven-clean-plugin + + + + ${lib.dir} + + + + + + + + org.apache.felix + maven-bundle-plugin + true + + META-INF/ + + eclipse-plugin + + + <_removeheaders> + Bnd-LastModified, + Build-Jdk, + Built-By, + Tool, + Include-Resource, + Private-Package, + Embedded-Artifacts, + Embed-Transitive, + Embed-StripVersion, + Embed-Directory, + Embed-Dependency, + Created-By + + <_exportcontents> + !org.bonitasoft.engine.*.impl.db;version="0.0.0", + !org.bonitasoft.engine.*.impl.db.archive;version="0.0.0", + org.bonitasoft.engine.*;version="0.0.0", + javax.xml.bind.*;version="2.2.0" + + <_nouses>true + <_noee>true + ${project.artifactId};singleton:=true + ${project.artifactId} + Bonita Community Tomcat Bundle + Bonitasoft S.A. + ${osgiVersion} + JavaSE-11 + true + ${lib.dir} + true + dir + + {maven-resources}, {maven-dependencies} + + .,{maven-dependencies} + !* + *;scope=compile|runtime + javax.activation;bundle-version="1.1.0" + + true + + + + Generate bundle MANIFEST.MF + package + + manifest + + + + + + + + + diff --git a/jds.ico b/jds.ico new file mode 100644 index 0000000000000000000000000000000000000000..ddbf4be3825021aeb809184362a65009efc96c2c GIT binary patch literal 49206 zcmeI5X;TzO7{|#Mh;K+0sj_03qAX$=qp<>7C1@Fq2hoTi21UFQ6%z%#xDik>aws>5 z9Lu$^EU+AVU|!`#K3M*n)vl@T-F47880Wv$3*EiX^zrMS>F(+7rw^UX{3qrAPbU6m z;M@52`&mjFY_ZS3pQofmzwbV4e@AFYfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1PmcCHa>d&#_tnTF2rMmJzH;f^ zw8Pu~+qP|MZGVn(`IwM-?RyD$#>aAUvL*P!SzLT!&OiI!Kq&A51j1{frsl>?n>GpB zaV@wJy1F|*Abehugg{_vvG`(fT;Op%@7=!}46h~$kUy=903PhGUJqUYap)ru ziUctP*!uNW3ApM^`!cP6ppQjh27wu$xA0t{%3Sh65ey9Wn~?y98IA<&>T4z7suM+k zrxtOUL}2Lkt6jUkQ?YA(Ff^E)nlLE=4AwU{d-%v}qhi=zNhDxN3h``M|scFyxihrGm2sDt4_8d!(k;ljW7bv13QI zz$N?MeS4QzmrPBA%LDiMXZP&+Uc#<*R#rW9IU=*OKRog}$@^;jG(9tAb{bqBeobw) zw$4lT+jstSIUlpL9}2IYJatmSE}XapFlsP64K5GgGchKBs}}Y}EvO!)w@Ov=F(163 z#*o2+G`Km6xq08_&6^VyL08WwF<<;9vSz)}H(7wXS6)$;h(9LO46dBkbJ*}PPEJoG z;*VAsYl>{BJR2UGu}qRo-$x%oE~8<6eqVOJNOTL7-nwahdfXOcV0ke$_3e^TsUUXj z*n#z3ZUbU{eoHQuNaTfc+B;=^dfXP{v%gvdaLLl%(dKX(;WaEjHpZCMm7SRMNZ5t* zPT6fc_!~vc8R1~n5N6>8bFC%!=Ujs-k26r%m07G&*J2lTG|ka@VPo!J7C}M+Rn?V( zxnzk>2avzX1Ug=}OW1|8ufLc4%_cDB85O`K3wlRp$IkHaE>yxUoY5I!lkYx;j~TH< zlfu`2yGlM55JCApA48A718u13NxoHMgtL!w|HNeDDQX%fIC zOH`YRJD&g8QXO4*V@GCN+n!6!Ul*qS8aP3%f=*~aD`EnO_vSOJxp`NQ!O$1OAH zXA0nw1w#Xql5yZb4zdZOjS>4dttoCb7QtVe9=F-a-`)}@fAY7NfW5J^{*%AG1niBS z_20GpG5EsXljg@w9WUCk8+X(*0)3uXgyx-@#uOD)SA9wbN)M1PnDGhE@W>D})IoVp zbxqYmU|#K+(}x5|fCNZ@1W14cNPq-LfCNZ@1V|te0nF#pkN^pg011!)36KB@kbu(( zboX}EH`G0T(u_rem^Olfp`Nxp*_ii*L;0h_rdIw(jSUifID2}#W0L9V=~xgo>+`BIHu^Y`KWg&!?b{{( zu@eU*lGp{Kwh>SUhz7sfkA=9{N)wpIEENo=6CM=7O1uTPgG+GKAfFhFI9$E`=?4`K%q+7<+B=E!4uN1*mcGW z#Z5SdEG7&^ud03tR30@K7!jy#1U4w){1lz>QcNNM$c5+5s#O}tMoW@#Hax0VCDChA zCF!G+z>Cff6)6rQRxigI<1Jghl7#UzLyMpa(?<^hyz1G#d$)u%D=P~-4b{uh$V!rM zLN}BuNgtgAZrr@CBJJ+!QZL6@(yC-x`5je~J~|1AZoC%kVyU*NVmLY<5*p>-9kwbZ}_k>a{B|q)@l6hJXWD zaT2b?zv%q0YVTCNmOeTO;7lcq3RPh|d7#`tf{%kypmaqQrjOwS;*N_kpf)@r2B;EP z3@jW~j-qtVm03P(A?)!)KQq<@VEhG*$7aQ~;b%5&%sBc*c*%yBZ#JfZQIh}( qkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36Q`>Ch#9c15+pf literal 0 HcmV?d00001 diff --git a/jdsicons.zip b/jdsicons.zip new file mode 100644 index 0000000000000000000000000000000000000000..d37194f0f0d03a09e69fed7b9d59081a2938766f GIT binary patch literal 14060 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 + + 4.0.0 + + org.bonitasoft.studio.bundles + plugins + 7.13.0 + + + org.bonitasoft.studio.bundles.plugins + org.bonitasoft.studio + eclipse-plugin + + + + + org.bonitasoft.maven + image-overlay-plugin + + ${basedir}/splash_without_version.bmp + ${basedir}/splash.bmp + bmp + 358 + 259 + true + 58 + #0B4361 + ${branding.version.short} + + + + + create-image + + + + + + + -- 2.11.0

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 AF8}}l literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d7f1051 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ed68beb --- /dev/null +++ b/README.md @@ -0,0 +1,175 @@ +# Build Bonita from sources + +[![Linux build](https://img.shields.io/travis/Bonitasoft-Community/Build-Bonita/master?label=Linux%20build&logo=travis)](https://travis-ci.org/Bonitasoft-Community/Build-Bonita) + +[![MacOS and Windows build](https://github.com/Bonitasoft-Community/Build-Bonita/workflows/MacOS%20and%20Windows%20Build/badge.svg)](https://github.com/Bonitasoft-Community/Build-Bonita/actions) + + +## Overview + +A bash script is provided to build the whole Bonita Community Edition solution from sources publicly available. + +It clones Git repositories and build all Bonita components in the right order to let you generate the Bonita Bundle and +the Bonita Studio. + + +## Requirements + +- Disk space: around 15 GB free space. Around 4 GB of dependencies will be downloaded (sources, 3rd party dependencies, +...). A fast internet connection is recommended. +- OS: Linux, MacOS and Windows (see test environments list below) +- Java: Oracle/OpenJDK Java 8 (⚠ you cannot use Java 11 to build Bonita). + + +## Instructions + +1. Clone this repository +1. Checkout the [branch/tag](#branches-and-tags) related to the Bonita version you want to build +1. Run `bash build-script.sh` in a terminal (on Windows, use git-bash as terminal i.e. the bash shell included with Git for Windows) +1. Once finished, the following binaries are available + 1. Bonita Studio (aka Bonita Development Suite): `bonita-studio/all-in-one/target` (only zip archive, no installer) + 1. Bonita Bundle (aka Bonita Runtime): `bonita-distrib/tomcat/target` + +**Notes** +- If you want to make 100% sure that you do a clean build from scratch, run the following commands: +```bash +rm -rf ~/.m2/repository/org/bonitasoft/ +rm -rf ~/.m2/repository/.cache +rm -rf ~/.m2/repository/.meta +rm -rf ~/.gradle/caches +find -type d -name ".gradle" -prune -exec rm -rf {} \; +find -type d -name target -prune -exec rm -rf {} \; +``` +- No tests are run by the script (at least no back end tests). If you want to run some tests, go to the directory + related to the Bonita component you want to test, and follow instructions (generally available in README file) +- The script does not produce Studio installers (required license for proprietary software). + + +## Test environments + +CI builds are run on push to master/dev branches and Pull Requests (see badges on top of this page) +- Linux: Ubuntu 18.04 (Travis CI) +- MacOS: Catalina (GitHub Actions) +- Windows: Windows Server 2019 DataCenter (GitHub Actions) + + +## Issues + +If you face any issue with this build script or for any question, please report it on the [build-bonita GitHub issues tracker](https://github.com/Bonitasoft-Community/Build-Bonita/issues). + +You can also ask for help on [Bonita Community forum](https://community.bonitasoft.com/questions-and-answers). + + +## Branches and Tags + +The use of `Build-Bonita` branch or tag depends of the Bonita version you want to build. + +| Bonita version | Build-Bonita branch or tag | +| -------- | ----- | +| latest maintenance version | `master` branch | +| old version | related tag (see the [tags](#tags) section below) | +| next Bonita GA version | `dev` branch | + +**Notes** +- `Build-Bonita` currently does not provide support for building Bonita SNAPSHOT versions aka next maintenance or +development versions. See [#41](https://github.com/Bonitasoft-Community/Build-Bonita/issue/41) for such a support + + +### Branches + +`Build-Bonita` uses the same branch names as the Bonita repositories +- `master` for latest available GA or maintenance version. It also contains latest build improvements related to the +solution provided by `Build-Bonita` +- `dev` for next Bonita version while developments are in progress + + +### Tags + +Tags are only available to build Bonita GA (i.e. 7.9.0, 7.10.0, ....) or maintenance (i.e. 7.7.5, 7.9.4, ....) versions, +not for development versions. + +### Tag scheme +- prior Bonita 7.10, `Build-Bonita` tags exactly match the Bonita version +- as of Bonita 7.10, tags use the `-` like `7.10.0-1`. This allows to track improvements or +bug fixes applied to `Build-Bonita` for a given Bonita version + +Examples + +| Bonita version | Build-Bonita tag | +| -------- | ----- | +| 7.10.1 | 7.10.1-1, 7.10.1-2, .... | +| 7.10.0 | 7.10.0-1, 7.10.0-2, .... | +| 7.9.4 | 7.9.4 | +| 7.7.5 | 7.7.5 | + + +# Developing on Build-Bonita + +The following is for contributors to this repository. + +Notice that a lot of actions are manual, so if it's becoming boring for you, fill an issue to discuss about it, then +provide a Pull Request to automate this and simplify our life + +## Add support for a new version + +Notice that most of the actions described below can be done directly using the GitHub website, for instance +- file edition +- branch and pull request creation + +See [GitHub help](https://help.github.com/en/github/managing-files-in-a-repository/editing-files-in-your-repository) for +more details + +### Bonita maintenance version + +- from GitHub interface, edit `build-script.sh`on `master` branch (you can follow [GitHub help](https://help.github.com/en/github/managing-files-in-a-repository/editing-files-in-your-repository)) +- update the `build-script.sh` file and update the `BONITA_VERSION` variable +- propose file changes by creating a new branch, for instance `maintenance_7.10.2` +- [create a Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request) targeting `master` +- wait for build to pass, this should work without any other modifications +- [merge the Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/merging-a-pull-request) after successful build + +### Bonita development version + +- create a new branch starting from the `dev` branch, for instance `dev_7.11.0.W10` +- update the `build-script.sh` file and update the `BONITA_VERSION` variable +- [create a Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request) targeting the `dev` branch +- wait for build to run +- failures often happen because of new components to be added or removed, build options of some components to be updated + - try to fix, then commit and iterate until build pass + - see [#32](https://github.com/Bonitasoft-Community/Build-Bonita/pull/32) or + [#48](https://github.com/Bonitasoft-Community/Build-Bonita/pull/48) for instance +- [merge the Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/merging-a-pull-request) after successful build + + +### Merging master and dev branches + +Follow the same lifecycle as Bonita component repositories. Merge are currently done manually by `Build-Bonita` +contributors +- `master` --> `dev`: all the time, especially after adding support for a new maintenance version. Allow to get new +improvements applied to maintenance versions, avoid subsequent merge conflicts, ... +- `dev` --> `master`: on GA release, `master` is going to become the maintenance branch for the new Bonita released +version. It is highly advised to do the merge in a dedicated branch as some issue occurred at that stage in the past + - first, ensure that `master` has been merged into`dev` + - create a new `bonita_7.10.0_GA` branch starting from `master` branch + - merge `dev` into `bonita_7.10.0_GA` + - [create a Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request) from `bonita_7.10.0_GA` targeting the `master` branch + - [merge the Pull Request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/merging-a-pull-request) into `master` when the build passed (eventually after fixing any issues related to the merge) + + +## New Release + +Release are cut when +- a new Bonita version (GA or maintenance) is supported by `Build-Bonita` +- significant improvements have been made in the `Build-Bonita` build script for the latest supported Bonita version + +### Create a GitHub release + +A new release can be create by following the [GitHub help](https://help.github.com/en/github/administering-a-repository/managing-releases-in-a-repository#creating-a-release) +- for `Tag version`, use a value that follows the [Tag Scheme](#tag-scheme). The tag will be created when the release +will be published +- for `Target` + - usually, keep the `master` branch except if new commits that you don't want to integrate for the release are already + available in the branch + - in that case, choose a dedicated commit + - **important**: ensure that the build to pass on the chosen branch or commit used to create the release + diff --git a/about.bmp b/about.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e9ec5dbf7d6a5fc8fd547d1e0e60ea14cc0bc42c GIT binary patch literal 39958 zcmeI5{ZkW17{}9pp#DNTcE%}V$5Dn_t##@nIQ*D3@>-c(+M z5MC0H5JE^G0s3?Quzuq;+imV{?{azDOEz=KJlWm5d-ikB?d?AMa)o8z+ALo_yYQQX z?;U(w@%_rO9>3D(@2@SE&^P>9{c9y&+saz7z2kLt&3T7&GG50t>2WNUcqzW<_g=eR zAHG_ahQ^zo1$Vp-Zo1>diK~5LZ2y7%1ga!#-m=-+*%4d~n2t*93dhWKWi`-YZO{59 zD*`I{TUAv#^LaXUP0e+L*tjluJr`>)5QJ(%c6K((-HbBa7`WQ(qkH%6QDZ3&KX?9| zXJOu4W@lJiLtHiQeK}Mq1lPenK4w^16YXe-EAHrl!H<P!at5*m-h5+Z6bH-tIw8`Qsp+yPG zAWEW2OOGxE{H8{mM6Tep9Pp$0O87AZv@ZnLu%kc^36!-kM+Q+TDl01sbqPHO*`}j0RO|4SI6?#2xd!)$~UKx{` zZ0fi!2bc7;7Y2qtY8nTJ2~x)uFr3p4&C&pV0}P|#kQ`g3lyZe?Xt-*Y2IG@%Uv?^P8zC;Dal!Jw0|-5%9->4{Q_RDi&PV z&=-~Z4cHWMlE7QdO+4tSQwMIi;_1ciWQ40`Wi_ZXTPaV*4Ofu3e&ZUkPDNqXHIs5+ zIu+oFYv21`MVutCx35QMwo;yqC$28{EJ3I!gc@EPJPP#az!O*aSJ;CMFf2w-o_I*Z z6IbwPZfRDuR4EY7ucc)_57;zy2yw+jmY1!oyNkgUQ4Vx^aic9m6VA9|_5qvg`w#t$ z-0%~{8CUP3ht2iL(>8wKF*MU81oV#?h;RYi&{6z7`l|9j};$%5L@EDr##}$=S zMp1yyg-~}F_Zxp)|9th5!4*-MI4-zGZ&;eG*_qjC!8LlWwy{yRy@qCjMt|5O@4{a> zfSNy>>)_Bpk|7y59e-TWC&T92-TTf!Mw7e?e_S!Slg;&Y`>P~FGH^QnxS|?`UP1<1 z445;J(IoG}A6Ed_{_}PQ*VcP?lMKng>A2)tP;ijJwYlY%fs7`37cRLTD?7&EiXQPK zLo#qWiv@Ej4D6TCUCx|6&EN_LLPF23=iq=AT9-n-8XeYu+qR$JNIG)#2sZdO&YnA) z!i_y#3oe4B=>`-MlihoE@7nb%D20Jpx_emFJ(5faQ4$bbqXecix!|f3RFugC*C>JM zOfIF941RL^2?>)g`uxm zq6AlU-$^XjP;eDoO)$)bn7FW4VXwko$?cG_g2jS=pT` z1q!Y*uGKZwG*?N+vXt+-yVNMk!v)v>b5)!5jH!B9-b>C;EktmoxMEHJii&c%u_EOD zgL{eyv5UhwC65wZDXwZuA7DYsd5>ET4WS7F<3g33U!BXHzBe;gSVwyN1L<^|zs#Uf6`V|(c#N@LVFQ3PQ zYi@2XPL3;gqWpN$W~^zRNE)yU#jwfWJ`quW#f$Ed3mPYpv1B@JqeRC0LJk!ckYu#* zWr-S+P>*1J)6vt{{b^))$}u@N@4~&KXD=SoVBKEV-0Z~EIF{RZ*V8rpX^7Seiy_ls zh>XV=o=kK~B6q&El4P`impYSEZ)jEIilOjoD|(<=A?=dc z_B!Ww<>cfLmbAcVwW_`SvZ1koT!&2Nx*E82xt3;0CuYED9_AwW_R0oR9aJ7h3d z)Cvd{T7ZiMQ-g@*(E=*62l5WkiHQu4BAqf*xw_|FY8BS!FP_naX!+rz2LvQ7;BkfO zES)k_xq5vI?bh}~hYDyskkPb>AVg?QIVa`q3+#fxiAg(2CJC9!RmwdI(czIH@*Kib z9IP~H)Z3fH2~8-bJj u6pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11q(?; zK~#90?VMk16h$1zKi6I7*gW3V9_2@k{=BlgAkKn;I_!~|oJ60~Yj{uQcHdp&5qc6_)i?9R^KUA>)~+jTyZ zCbz%&Wq;rA?RIx>=58Q5+{sRMm=>Xrde+g4Kp=R^v=|+cd24QLC1DxRhXfgsJ@QeO>ylFbi|Xe^5P zbaL8Z;W#x?#(mN$JIRAalor8Fj7mr9El*CDl<|}2jVOCINERkoCS^1-DCKN6qO=Gq z*e6-|o+>HlIVmH>4MwyUK^rN_#EYJs9x3As13HUjlVo9(>!pl#(o)W2CWID4H9txg zKKJD8@LYao7*JXiDPX!%{{E#PaNRBg33!kn@~jM3;6S8fal2Ei`kQPqMMk zc+!>AM>}a(id%>N%IS?{v>aP&tyI4q~2|k<|=;9_MGBn68S8a zqe)mV^^SRN`fCt;$2w-_H(0JF;~bOvKax~ea&KYw%GV^Umip5y$z`HqI*!YRZVtP) zV?3NIJ)9=t)hn-(ba5+h7qheSJY504MsSwSLIyhGc{7rXkmPTMnFK}|pY|IyeKHRM zv#F(y2G`@rRbFB-pYl%$)L1MQi^XEGSS%Kc#bU8oETy56jkIwcO;jU5n(GS>HOyxb zcd&vur{vBULW+!$(mVqh9F@!l>Rkh?8+b=f^Nzb#Q>{^!5yCo6FfFXfs9;S-1#2=Y zWbTtm#ux@Jb4f#uTd4EIQXCIt-!;r6GoM-IGmi<7t1BRmDCUk2YN|C$^(Yf3si~Z^ zuoqobmHREl|70mmDluiUq#pqEo2-z&)tDh-CKFUDqJLp;Ir`HPwvhP2mppx@+N zWi(LXM)Q;prMQp$`MyM72CfgLT0qs>?=r(z+ z^6L7F=Bg69P2R4I9@Sh`Lbu7=l+hnFSC!Ch@*YJ@a7=U6k`m**VpL$D)H3uQ$t7H) zh<>BBrUJbtA5caQXsuatzEu7IqTRHtAW1N$uy|4VAzCXsPuC}uzbD?ygvOdmbeeot z8SU0svEec^2l%w7%#}`POm5=Qyr0EiE{<`&c~bStKa5JnnO<3f7yJ78Fal z=wq=rD#x*jejkeyEH^DK80tCXV^Pp$T3j&HdKTfj+WMJeT3!&;ve(z*xN^iUbTo0m z*J4B-$rt37Jv0DffzCpe2~+i;AHsL<8%_|c`oF!cp}_K@u4eAs{6M?;T?30@d*3#8Wij< zbgj5@V+LzET7ba`wuJZAAE#3}8t!gGxtCQ71FIRzY4KYYnU)v?3pwaxaGb5-e|(!l zecJYNmuX=^v&!{Aeu>Rd8M|>akFT;8yTkollbcGmaG3i|%P5?G0gX7r9)x_7k^lez M07*qoM6N<$f-x?J8UO$Q literal 0 HcmV?d00001 diff --git a/all-in-one.bonitastudio-features.product b/all-in-one.bonitastudio-features.product new file mode 100644 index 0000000..9587ecc --- /dev/null +++ b/all-in-one.bonitastudio-features.product @@ -0,0 +1,95 @@ + + + + + + + + + + -clean + + -Xmx1g -Xms512m -Dosgi.requiredJavaVersion=11 -Dfile.encoding=UTF8 + + -XstartOnFirstThread + + -Dgreclipse.nonlocking=true + + + + + + + + + + + + + + + + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + + + + http://www.gnu.org/licenses/gpl-2.0.html + + Copyright (C) 2021 Kyoto Prefecture + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2.0 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see <http://www.gnu.org/licenses/>. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/all-in-one.installer.installer.properties b/all-in-one.installer.installer.properties new file mode 100644 index 0000000..b79e3ab --- /dev/null +++ b/all-in-one.installer.installer.properties @@ -0,0 +1,49 @@ +##### Properties used only in this file ##### +img.folder=${basedir}/installer/images +shortcut.base=BonitaStudioCommunity + +##### Properties used by build file ##### +project.file=${basedir}/installer/installer_project_template.xml +##### Properties used by the project file ##### +enable.uninstaller=${enable.uninstaller} + + +#Product +vendor=JapanDigital +product.short.name=KyousouCommunity +product.full.name=Kyousou Community +product.version=${project.version} +branding.version=${branding.version} + +#Folders +bitrock.output=${bitrock.install}/output + +#Shortcuts +shortcut.comment=Starts ${product.full.name} +shortcut.name=${product.short.name}-${branding.version} + +mac.shortcut.name=${shortcut.base}-${branding.version}.app +windows.shortcut.name=${shortcut.base}.exe +windows64.shortcut.name=${shortcut.base}.exe +linux.shortcut.name=${shortcut.base} + +linux.shortcut=${studio.dir}/${linux.shortcut.name} +windows.shortcut=${studio.dir}/${windows.shortcut.name} +windows64.shortcut=${studio.dir}/${windows64.shortcut.name} + +#Resources +license=${studio.dir}/gpl-2.0.txt +wizard.image=${img.folder}/icon-64-64.png +logo=${img.folder}/topRight.png +leftImage=${img.folder}/leftImage.png +splash=${img.folder}/splash.png +titlebar.image=${img.folder}/icon-installer-48.png +windows.ico=${img.folder}/windows.ico +mac.icns=${mac.studio.dir}/${mac.shortcut.name}/Contents/Resources/bonitasoft-icon-128-128-transparent.icns +mac.installer.icns=${img.folder}/install.icns +slide1=${img.folder}/slide01-01.png +slide2=${img.folder}/slide02-01.png +slide3=${img.folder}/slide03-01.png + +#path from install dir (runtime) to xpm file +linux.icon=${all.in.one.foler}/icon.xpm diff --git a/all-in-one.installer.installer_project_template.xml b/all-in-one.installer.installer_project_template.xml new file mode 100644 index 0000000..291e76c --- /dev/null +++ b/all-in-one.installer.installer_project_template.xml @@ -0,0 +1,502 @@ + + @product.short.name@ + @product.full.name@ + @branding.version@ + @bitrock.output@ + @installer.name@ + @license@ + utf-8 + @logo@ + @leftImage@ + @splash@ + 1 + @titlebar.image@ + @windows.ico@ + @mac.installer.icns@ + osx-intel osx-x86_64 + 1 + @enable.uninstaller@ + 1 + 8 + + + @slide1@ + + + @slide2@ + + + @slide3@ + + + 1 + 1 + zip + en es fr ja pt_BR + + + en + i18n/messages.properties + iso8859-1 + 1 + + + fr + i18n/messages_fr.properties + iso8859-1 + 1 + + + es + i18n/messages_es.properties + iso8859-1 + 1 + + + ja + i18n/messages_ja.properties + iso8859-1 + 1 + + + pt_BR + i18n/messages_pt_BR.properties + iso8859-1 + 1 + + + + + iso8859-1 + ${build_project_directory}/i18n/*.properties + regexp + + + \\: + : + + + \\! + ! + + + + + + + + installdir + ${env(SYSTEMDRIVE)}/@product.short.name@-${product_version} + + + + + + + installdir + ${platform_install_prefix} + + + + + + + windowsExecName + @windows.shortcut.name@ + + + + + + + + + + + ini_file + ${installdir}/configuration/config.ini + + + 1 + osx + + + + + ini_file + ${installdir}/@mac.shortcut.name@/Contents/Eclipse/configuration/config.ini + + + + + + ${ini_file} +