From 500e9072a26f14f787b84bf73d7f32c5d21dfcea Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 8 Sep 2022 16:40:50 -0700 Subject: [PATCH 01/41] add java assets as-is --- templates/todo/api/java/.gitignore | 33 ++ .../api/java/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 58727 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 + templates/todo/api/java/README.md | 39 ++ templates/todo/api/java/mvnw | 316 ++++++++++ templates/todo/api/java/mvnw.cmd | 188 ++++++ templates/todo/api/java/pom.xml | 130 +++++ .../simpletodo/SimpleTodoApplication.java | 12 + .../azure/simpletodo/api/ApiUtil.java | 19 + .../azure/simpletodo/api/ListsApi.java | 497 ++++++++++++++++ .../configuration/MongoDBConfiguration.java | 38 ++ .../configuration/RFC3339DateFormat.java | 38 ++ .../configuration/WebConfiguration.java | 24 + .../azure/simpletodo/model/TodoItem.java | 233 ++++++++ .../azure/simpletodo/model/TodoList.java | 128 ++++ .../azure/simpletodo/model/TodoState.java | 47 ++ .../repository/TodoItemRepository.java | 17 + .../repository/TodoListRepository.java | 7 + .../simpletodo/web/TodoListsController.java | 179 ++++++ .../src/main/resources/application.properties | 8 + .../api/java/src/main/resources/openapi.yaml | 546 ++++++++++++++++++ .../SimpleTodoApplicationTests.java | 13 + 22 files changed, 2530 insertions(+) create mode 100644 templates/todo/api/java/.gitignore create mode 100644 templates/todo/api/java/.mvn/wrapper/maven-wrapper.jar create mode 100644 templates/todo/api/java/.mvn/wrapper/maven-wrapper.properties create mode 100644 templates/todo/api/java/README.md create mode 100755 templates/todo/api/java/mvnw create mode 100644 templates/todo/api/java/mvnw.cmd create mode 100644 templates/todo/api/java/pom.xml create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ApiUtil.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/MongoDBConfiguration.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/RFC3339DateFormat.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java create mode 100644 templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java create mode 100644 templates/todo/api/java/src/main/resources/application.properties create mode 100644 templates/todo/api/java/src/main/resources/openapi.yaml create mode 100644 templates/todo/api/java/src/test/java/com/microsoft/azure/simpletodo/SimpleTodoApplicationTests.java diff --git a/templates/todo/api/java/.gitignore b/templates/todo/api/java/.gitignore new file mode 100644 index 00000000000..549e00a2a96 --- /dev/null +++ b/templates/todo/api/java/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/templates/todo/api/java/.mvn/wrapper/maven-wrapper.jar b/templates/todo/api/java/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1dd12f17644411d6e840bd5a10c6ecda0175f18 GIT binary patch literal 58727 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%0ANsA|A3-jj|r`KAo%oTajX3>^E` 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 YM{}PByk10KD_nuQ4E7Du?}+~TKh4V)`~Uy| literal 0 HcmV?d00001 diff --git a/templates/todo/api/java/.mvn/wrapper/maven-wrapper.properties b/templates/todo/api/java/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..db95c131dde --- /dev/null +++ b/templates/todo/api/java/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/templates/todo/api/java/README.md b/templates/todo/api/java/README.md new file mode 100644 index 00000000000..77c9ee48f47 --- /dev/null +++ b/templates/todo/api/java/README.md @@ -0,0 +1,39 @@ +# Java with Spring Boot REST API + +## Setup + +### Prerequisites + +- Java 17 or later + +### Local Environment + +Create a `.env` with the following configuration: + +- `SPRING_DATA_MONGODB_URI` - Cosmos DB connection string (Mongo DB also supported) + +### Build & Compile + +Run `./mvnw package` to build & compile the application in the `target` directory. + +### Run the application locally + +Run `./mvnw spring-boot:run` to start the local development server. + +The REST API will be available at `http://localhost:8080`. + +### Build the Docker image + +Run `./mvnw spring-boot:build-image` to build the Docker image. + +### Run the Docker image + +The environment variable `SPRING_DATA_MONGODB_URI` must point to the Cosmos DB connection string. + +Run `docker run -it -p 8080:8080 -e SPRING_DATA_MONGODB_URI=$SPRING_DATA_MONGODB_URI azure/azure-dev-todo-java` to start the Docker image. + +## Deploy to Azure App Service using Maven + +The Maven property `basename` must point to the base name of your project. + +Run `./mvnw package azure-webapp:deploy -Dbasename=my-java-project` (and replace `my-java-project` by the base name of your project). diff --git a/templates/todo/api/java/mvnw b/templates/todo/api/java/mvnw new file mode 100755 index 00000000000..5643201c7d8 --- /dev/null +++ b/templates/todo/api/java/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/templates/todo/api/java/mvnw.cmd b/templates/todo/api/java/mvnw.cmd new file mode 100644 index 00000000000..8a15b7f311f --- /dev/null +++ b/templates/todo/api/java/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/templates/todo/api/java/pom.xml b/templates/todo/api/java/pom.xml new file mode 100644 index 00000000000..b3825bac781 --- /dev/null +++ b/templates/todo/api/java/pom.xml @@ -0,0 +1,130 @@ + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.2 + + + com.microsoft.azure.simpletodo + simple-todo + 0.0.1-SNAPSHOT + SimpleTodo + Simple Todo application + + tmp-judubois-1111 + 17 + ${java.version} + ${java.version} + 1.6.4 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.data + spring-data-commons + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.openapitools + jackson-databind-nullable + 0.2.2 + + + + jakarta.validation + jakarta.validation-api + + + com.fasterxml.jackson.core + jackson-databind + + + + src/main/java + + .env + + + + src/main/resources + + application.properties + + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + + azure/azure-dev-todo-java + + + + + + repackage + + + + + + com.microsoft.azure + azure-webapp-maven-plugin + 2.3.0 + + ${basename}rg + ${basename}api + B1 + + Linux + Java SE + Java 11 + + + + + jar + ${project.basedir}/target + + *.jar + + + + + + + + + diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java new file mode 100644 index 00000000000..d723329cd3f --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java @@ -0,0 +1,12 @@ +package com.microsoft.azure.simpletodo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SimpleTodoApplication { + + public static void main(String[] args) { + new SpringApplication(SimpleTodoApplication.class).run(args); + } +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ApiUtil.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ApiUtil.java new file mode 100644 index 00000000000..bcdbd2577c0 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ApiUtil.java @@ -0,0 +1,19 @@ +package com.microsoft.azure.simpletodo.api; + +import org.springframework.web.context.request.NativeWebRequest; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class ApiUtil { + public static void setExampleResponse(NativeWebRequest req, String contentType, String example) { + try { + HttpServletResponse res = req.getNativeResponse(HttpServletResponse.class); + res.setCharacterEncoding("UTF-8"); + res.addHeader("Content-Type", contentType); + res.getWriter().print(example); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java new file mode 100644 index 00000000000..4027c9a4c17 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java @@ -0,0 +1,497 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (5.3.1). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +package com.microsoft.azure.simpletodo.api; + +import com.microsoft.azure.simpletodo.model.TodoItem; +import com.microsoft.azure.simpletodo.model.TodoList; +import com.microsoft.azure.simpletodo.model.TodoState; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.NativeWebRequest; + +import javax.annotation.Generated; +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.List; +import java.util.Optional; + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:06:05.934415+01:00[Europe/Berlin]") +@Validated +@Tag(name = "lists", description = "the lists API") +public interface ListsApi { + + default Optional getRequest() { + return Optional.empty(); + } + + /** + * POST /lists/{listId}/items : Creates a new Todo item within a list + * + * @param listId The Todo list unique identifier (required) + * @param todoItem The Todo Item (optional) + * @return A Todo item result (status code 201) + * or Todo list not found (status code 404) + */ + @Operation( + operationId = "createItem", + summary = "Creates a new Todo item within a list", + tags = {"Items"}, + responses = { + @ApiResponse(responseCode = "201", description = "A Todo item result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } + ) + @RequestMapping( + method = RequestMethod.POST, + value = "/lists/{listId}/items", + produces = {"application/json"}, + consumes = {"application/json"} + ) + default ResponseEntity createItem( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "TodoItem", description = "The Todo Item", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoItem todoItem + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * POST /lists : Creates a new Todo list + * + * @param todoList The Todo List (optional) + * @return A Todo list result (status code 201) + * or Invalid request schema (status code 400) + */ + @Operation( + operationId = "createList", + summary = "Creates a new Todo list", + tags = {"Lists"}, + responses = { + @ApiResponse(responseCode = "201", description = "A Todo list result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))), + @ApiResponse(responseCode = "400", description = "Invalid request schema") + } + ) + @RequestMapping( + method = RequestMethod.POST, + value = "/lists", + produces = {"application/json"}, + consumes = {"application/json"} + ) + default ResponseEntity createList( + @Parameter(name = "TodoList", description = "The Todo List", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoList todoList + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * DELETE /lists/{listId}/items/{itemId} : Deletes a Todo item by unique identifier + * + * @param listId The Todo list unique identifier (required) + * @param itemId The Todo list unique identifier (required) + * @return Todo item deleted successfully (status code 204) + * or Todo list or item not found (status code 404) + */ + @Operation( + operationId = "deleteItemById", + summary = "Deletes a Todo item by unique identifier", + tags = {"Items"}, + responses = { + @ApiResponse(responseCode = "204", description = "Todo item deleted successfully"), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } + ) + @RequestMapping( + method = RequestMethod.DELETE, + value = "/lists/{listId}/items/{itemId}" + ) + default ResponseEntity deleteItemById( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("itemId") String itemId + ) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * DELETE /lists/{listId} : Deletes a Todo list by unique identifier + * + * @param listId The Todo list unique identifier (required) + * @return Todo list deleted successfully (status code 204) + * or Todo list not found (status code 404) + */ + @Operation( + operationId = "deleteListById", + summary = "Deletes a Todo list by unique identifier", + tags = {"Lists"}, + responses = { + @ApiResponse(responseCode = "204", description = "Todo list deleted successfully"), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } + ) + @RequestMapping( + method = RequestMethod.DELETE, + value = "/lists/{listId}" + ) + default ResponseEntity deleteListById( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId + ) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * GET /lists/{listId}/items/{itemId} : Gets a Todo item by unique identifier + * + * @param listId The Todo list unique identifier (required) + * @param itemId The Todo list unique identifier (required) + * @return A Todo item result (status code 200) + * or Todo list or item not found (status code 404) + */ + @Operation( + operationId = "getItemById", + summary = "Gets a Todo item by unique identifier", + tags = {"Items"}, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo item result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/lists/{listId}/items/{itemId}", + produces = {"application/json"} + ) + default ResponseEntity getItemById( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("itemId") String itemId + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * GET /lists/{listId}/items : Gets Todo items within the specified list + * + * @param listId The Todo list unique identifier (required) + * @param top The max number of items to returns in a result (optional) + * @param skip The number of items to skip within the results (optional) + * @return An array of Todo items (status code 200) + * or Todo list not found (status code 404) + */ + @Operation( + operationId = "getItemsByListId", + summary = "Gets Todo items within the specified list", + tags = {"Items"}, + responses = { + @ApiResponse(responseCode = "200", description = "An array of Todo items", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/lists/{listId}/items", + produces = {"application/json"} + ) + default ResponseEntity> getItemsByListId( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "top", description = "The max number of items to returns in a result", schema = @Schema(description = "")) @Valid @RequestParam(value = "top", required = false) BigDecimal top, + @Parameter(name = "skip", description = "The number of items to skip within the results", schema = @Schema(description = "")) @Valid @RequestParam(value = "skip", required = false) BigDecimal skip + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * GET /lists/{listId}/items/state/{state} : Gets a list of Todo items of a specific state + * + * @param listId The Todo list unique identifier (required) + * @param state The Todo item state (required) + * @param top The max number of items to returns in a result (optional) + * @param skip The number of items to skip within the results (optional) + * @return An array of Todo items (status code 200) + * or Todo list or item not found (status code 404) + */ + @Operation( + operationId = "getItemsByListIdAndState", + summary = "Gets a list of Todo items of a specific state", + tags = {"Items"}, + responses = { + @ApiResponse(responseCode = "200", description = "An array of Todo items", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/lists/{listId}/items/state/{state}", + produces = {"application/json"} + ) + default ResponseEntity> getItemsByListIdAndState( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "state", description = "The Todo item state", required = true, schema = @Schema(description = "", allowableValues = {"todo", "inprogress", "done"})) @PathVariable("state") TodoState state, + @Parameter(name = "top", description = "The max number of items to returns in a result", schema = @Schema(description = "")) @Valid @RequestParam(value = "top", required = false) BigDecimal top, + @Parameter(name = "skip", description = "The number of items to skip within the results", schema = @Schema(description = "")) @Valid @RequestParam(value = "skip", required = false) BigDecimal skip + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * GET /lists/{listId} : Gets a Todo list by unique identifier + * + * @param listId The Todo list unique identifier (required) + * @return A Todo list result (status code 200) + * or Todo list not found (status code 404) + */ + @Operation( + operationId = "getListById", + summary = "Gets a Todo list by unique identifier", + tags = {"Lists"}, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo list result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/lists/{listId}", + produces = {"application/json"} + ) + default ResponseEntity getListById( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * GET /lists : Gets an array of Todo lists + * + * @param top The max number of items to returns in a result (optional) + * @param skip The number of items to skip within the results (optional) + * @return An array of Todo lists (status code 200) + */ + @Operation( + operationId = "getLists", + summary = "Gets an array of Todo lists", + tags = {"Lists"}, + responses = { + @ApiResponse(responseCode = "200", description = "An array of Todo lists", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))) + } + ) + @RequestMapping( + method = RequestMethod.GET, + value = "/lists", + produces = {"application/json"} + ) + default ResponseEntity> getLists( + @Parameter(name = "top", description = "The max number of items to returns in a result", schema = @Schema(description = "")) @Valid @RequestParam(value = "top", required = false) BigDecimal top, + @Parameter(name = "skip", description = "The number of items to skip within the results", schema = @Schema(description = "")) @Valid @RequestParam(value = "skip", required = false) BigDecimal skip + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * PUT /lists/{listId}/items/{itemId} : Updates a Todo item by unique identifier + * + * @param listId The Todo list unique identifier (required) + * @param itemId The Todo list unique identifier (required) + * @param todoItem The Todo Item (optional) + * @return A Todo item result (status code 200) + * or Todo item is invalid (status code 400) + * or Todo list or item not found (status code 404) + */ + @Operation( + operationId = "updateItemById", + summary = "Updates a Todo item by unique identifier", + tags = {"Items"}, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo item result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), + @ApiResponse(responseCode = "400", description = "Todo item is invalid"), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } + ) + @RequestMapping( + method = RequestMethod.PUT, + value = "/lists/{listId}/items/{itemId}", + produces = {"application/json"}, + consumes = {"application/json"} + ) + default ResponseEntity updateItemById( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("itemId") String itemId, + @Parameter(name = "TodoItem", description = "The Todo Item", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoItem todoItem + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * PUT /lists/{listId}/items/state/{state} : Changes the state of the specified list items + * + * @param listId The Todo list unique identifier (required) + * @param state The Todo item state (required) + * @param requestBody (optional) + * @return Todo items updated (status code 204) + * or Update request is invalid (status code 400) + */ + @Operation( + operationId = "updateItemsStateByListId", + summary = "Changes the state of the specified list items", + tags = {"Items"}, + responses = { + @ApiResponse(responseCode = "204", description = "Todo items updated"), + @ApiResponse(responseCode = "400", description = "Update request is invalid") + } + ) + @RequestMapping( + method = RequestMethod.PUT, + value = "/lists/{listId}/items/state/{state}", + consumes = {"application/json"} + ) + default ResponseEntity updateItemsStateByListId( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "state", description = "The Todo item state", required = true, schema = @Schema(description = "", allowableValues = {"todo", "inprogress", "done"})) @PathVariable("state") TodoState state, + @Parameter(name = "request_body", description = "", schema = @Schema(description = "")) @Valid @RequestBody(required = false) List requestBody + ) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * PUT /lists/{listId} : Updates a Todo list by unique identifier + * + * @param listId The Todo list unique identifier (required) + * @param todoList The Todo List (optional) + * @return A Todo list result (status code 200) + * or Todo list is invalid (status code 400) + */ + @Operation( + operationId = "updateListById", + summary = "Updates a Todo list by unique identifier", + tags = {"Lists"}, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo list result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))), + @ApiResponse(responseCode = "400", description = "Todo list is invalid") + } + ) + @RequestMapping( + method = RequestMethod.PUT, + value = "/lists/{listId}", + produces = {"application/json"}, + consumes = {"application/json"} + ) + default ResponseEntity updateListById( + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, + @Parameter(name = "TodoList", description = "The Todo List", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoList todoList + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/MongoDBConfiguration.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/MongoDBConfiguration.java new file mode 100644 index 00000000000..a47d5eb92fe --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/MongoDBConfiguration.java @@ -0,0 +1,38 @@ +package com.microsoft.azure.simpletodo.configuration; + +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.util.Arrays; +import java.util.Date; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; + +@Configuration +public class MongoDBConfiguration { + + @Bean + public MongoCustomConversions mongoCustomConversions() { + return new MongoCustomConversions(Arrays.asList( + new OffsetDateTimeReadConverter(), + new OffsetDateTimeWriteConverter() + )); + } + + static class OffsetDateTimeWriteConverter implements Converter { + + @Override + public Date convert(OffsetDateTime source) { + return Date.from(source.toInstant().atZone(ZoneOffset.UTC).toInstant()); + } + } + + static class OffsetDateTimeReadConverter implements Converter { + + @Override + public OffsetDateTime convert(Date source) { + return source.toInstant().atOffset(ZoneOffset.UTC); + } + } +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/RFC3339DateFormat.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/RFC3339DateFormat.java new file mode 100644 index 00000000000..06754ffab41 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/RFC3339DateFormat.java @@ -0,0 +1,38 @@ +package com.microsoft.azure.simpletodo.configuration; + +import com.fasterxml.jackson.databind.util.StdDateFormat; + +import java.text.DateFormat; +import java.text.FieldPosition; +import java.text.ParsePosition; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; + +public class RFC3339DateFormat extends DateFormat { + private static final long serialVersionUID = 1L; + private static final TimeZone TIMEZONE_Z = TimeZone.getTimeZone("UTC"); + + private final StdDateFormat fmt = new StdDateFormat() + .withTimeZone(TIMEZONE_Z) + .withColonInTimeZone(true); + + public RFC3339DateFormat() { + this.calendar = new GregorianCalendar(); + } + + @Override + public Date parse(String source, ParsePosition pos) { + return fmt.parse(source, pos); + } + + @Override + public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { + return fmt.format(date, toAppendTo, fieldPosition); + } + + @Override + public Object clone() { + return this; + } +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java new file mode 100644 index 00000000000..e898508a60d --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java @@ -0,0 +1,24 @@ +package com.microsoft.azure.simpletodo.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfiguration { + + @Bean + public WebMvcConfigurer webConfigurer() { + return new WebMvcConfigurer() { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("*") + .allowedHeaders("Content-Type"); + } + }; + } +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java new file mode 100644 index 00000000000..3dc964cecc3 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java @@ -0,0 +1,233 @@ +package com.microsoft.azure.simpletodo.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.annotation.Generated; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.time.OffsetDateTime; +import java.util.Objects; + +/** + * A task that needs to be completed + */ + +@Schema(name = "TodoItem", description = "A task that needs to be completed") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:13:58.701016+01:00[Europe/Berlin]") +public class TodoItem { + + @JsonProperty("id") + private String id; + + @JsonProperty("listId") + private String listId; + + @JsonProperty("name") + private String name; + + @JsonProperty("description") + private String description; + + @JsonProperty("state") + private TodoState state; + + @JsonProperty("dueDate") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + private OffsetDateTime dueDate; + + @JsonProperty("completedDate") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + private OffsetDateTime completedDate; + + public TodoItem id(String id) { + this.id = id; + return this; + } + + /** + * Get id + * + * @return id + */ + + @Schema(name = "id", required = false) + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public TodoItem listId(String listId) { + this.listId = listId; + return this; + } + + /** + * Get listId + * + * @return listId + */ + @NotNull + @Schema(name = "listId", required = true) + public String getListId() { + return listId; + } + + public void setListId(String listId) { + this.listId = listId; + } + + public TodoItem name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * + * @return name + */ + @NotNull + @Schema(name = "name", required = true) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TodoItem description(String description) { + this.description = description; + return this; + } + + /** + * Get description + * + * @return description + */ + @NotNull + @Schema(name = "description", required = true) + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public TodoItem state(TodoState state) { + this.state = state; + return this; + } + + /** + * Get state + * + * @return state + */ + @Valid + @Schema(name = "state", required = false) + public TodoState getState() { + return state; + } + + public void setState(TodoState state) { + this.state = state; + } + + public TodoItem dueDate(OffsetDateTime dueDate) { + this.dueDate = dueDate; + return this; + } + + /** + * Get dueDate + * + * @return dueDate + */ + @Valid + @Schema(name = "dueDate", required = false) + public OffsetDateTime getDueDate() { + return dueDate; + } + + public void setDueDate(OffsetDateTime dueDate) { + this.dueDate = dueDate; + } + + public TodoItem completedDate(OffsetDateTime completedDate) { + this.completedDate = completedDate; + return this; + } + + /** + * Get completedDate + * + * @return completedDate + */ + @Valid + @Schema(name = "completedDate", required = false) + public OffsetDateTime getCompletedDate() { + return completedDate; + } + + public void setCompletedDate(OffsetDateTime completedDate) { + this.completedDate = completedDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TodoItem todoItem = (TodoItem) o; + return Objects.equals(this.id, todoItem.id) && + Objects.equals(this.listId, todoItem.listId) && + Objects.equals(this.name, todoItem.name) && + Objects.equals(this.description, todoItem.description) && + Objects.equals(this.state, todoItem.state) && + Objects.equals(this.dueDate, todoItem.dueDate) && + Objects.equals(this.completedDate, todoItem.completedDate); + } + + @Override + public int hashCode() { + return Objects.hash(id, listId, name, description, state, dueDate, completedDate); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TodoItem {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" listId: ").append(toIndentedString(listId)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" description: ").append(toIndentedString(description)).append("\n"); + sb.append(" state: ").append(toIndentedString(state)).append("\n"); + sb.append(" dueDate: ").append(toIndentedString(dueDate)).append("\n"); + sb.append(" completedDate: ").append(toIndentedString(completedDate)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java new file mode 100644 index 00000000000..1269377d8ad --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java @@ -0,0 +1,128 @@ +package com.microsoft.azure.simpletodo.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; + +import javax.annotation.Generated; +import javax.validation.constraints.NotNull; +import java.util.Objects; + +/** + * A list of related Todo items + */ + +@Schema(name = "TodoList", description = " A list of related Todo items") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:13:58.701016+01:00[Europe/Berlin]") +public class TodoList { + + @JsonProperty("id") + private String id; + + @JsonProperty("name") + private String name; + + @JsonProperty("description") + private String description; + + public TodoList id(String id) { + this.id = id; + return this; + } + + /** + * Get id + * + * @return id + */ + + @Schema(name = "id", required = false) + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public TodoList name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * + * @return name + */ + @NotNull + @Schema(name = "name", required = true) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TodoList description(String description) { + this.description = description; + return this; + } + + /** + * Get description + * + * @return description + */ + + @Schema(name = "description", required = false) + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TodoList todoList = (TodoList) o; + return Objects.equals(this.id, todoList.id) && + Objects.equals(this.name, todoList.name) && + Objects.equals(this.description, todoList.description); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, description); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TodoList {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" description: ").append(toIndentedString(description)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} + diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java new file mode 100644 index 00000000000..83e93391af5 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java @@ -0,0 +1,47 @@ +package com.microsoft.azure.simpletodo.model; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import javax.annotation.Generated; + +/** + * Gets or Sets TodoState + */ + +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:13:58.701016+01:00[Europe/Berlin]") +public enum TodoState { + + TODO("todo"), + + INPROGRESS("inprogress"), + + DONE("done"); + + private String value; + + TodoState(String value) { + this.value = value; + } + + @JsonCreator + public static TodoState fromValue(String value) { + for (TodoState b : TodoState.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} + diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java new file mode 100644 index 00000000000..4efca334a40 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java @@ -0,0 +1,17 @@ +package com.microsoft.azure.simpletodo.repository; + +import com.microsoft.azure.simpletodo.model.TodoItem; +import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; + +import java.util.List; + +public interface TodoItemRepository extends MongoRepository { + + @Query("{ 'listId' : ?0 }") + List findTodoItemsByTodoList(String listId, Pageable pageable); + + @Query("{ 'listId' : ?0, 'state' : ?1 }") + List findTodoItemsByTodoListAndState(String listId, String state, Pageable pageable); +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java new file mode 100644 index 00000000000..dc0201072c0 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.simpletodo.repository; + +import com.microsoft.azure.simpletodo.model.TodoList; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface TodoListRepository extends MongoRepository { +} diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java new file mode 100644 index 00000000000..b38963d7df9 --- /dev/null +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java @@ -0,0 +1,179 @@ +package com.microsoft.azure.simpletodo.web; + +import com.microsoft.azure.simpletodo.api.ListsApi; +import com.microsoft.azure.simpletodo.model.TodoItem; +import com.microsoft.azure.simpletodo.model.TodoList; +import com.microsoft.azure.simpletodo.model.TodoState; +import com.microsoft.azure.simpletodo.repository.TodoItemRepository; +import com.microsoft.azure.simpletodo.repository.TodoListRepository; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import java.math.BigDecimal; +import java.net.URI; +import java.util.List; +import java.util.Optional; + +@RestController +public class TodoListsController implements ListsApi { + + private final TodoListRepository todoListRepository; + + private final TodoItemRepository todoItemRepository; + + public TodoListsController(TodoListRepository todoListRepository, TodoItemRepository todoItemRepository) { + this.todoListRepository = todoListRepository; + this.todoItemRepository = todoItemRepository; + } + + @Override + public ResponseEntity createItem(String listId, TodoItem todoItem) { + Optional optionalTodoList = todoListRepository.findById(listId); + if (optionalTodoList.isPresent()) { + todoItem.setListId(listId); + TodoItem savedTodoItem = todoItemRepository.save(todoItem); + URI location = ServletUriComponentsBuilder + .fromCurrentRequest() + .path("/{id}") + .buildAndExpand(savedTodoItem.getId()) + .toUri(); + return ResponseEntity.created(location).build(); + } else { + return ResponseEntity.notFound().build(); + } + } + + @Override + public ResponseEntity createList(TodoList todoList) { + try { + TodoList savedTodoList = todoListRepository.save(todoList); + URI location = ServletUriComponentsBuilder + .fromCurrentRequest() + .path("/{id}") + .buildAndExpand(savedTodoList.getId()) + .toUri(); + return ResponseEntity.created(location).build(); + } catch (Exception e) { + return ResponseEntity.badRequest().build(); + } + } + + @Override + public ResponseEntity deleteItemById(String listId, String itemId) { + Optional todoItem = getTodoItem(listId, itemId); + if (todoItem.isPresent()) { + todoItemRepository.deleteById(itemId); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } else { + return ResponseEntity.notFound().build(); + } + } + + @Override + public ResponseEntity deleteListById(String listId) { + Optional todoList = todoListRepository.findById(listId); + if (todoList.isPresent()) { + todoListRepository.deleteById(listId); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } else { + return ResponseEntity.notFound().build(); + } + } + + @Override + public ResponseEntity getItemById(String listId, String itemId) { + return getTodoItem(listId, itemId).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + } + + @Override + public ResponseEntity> getItemsByListId(String listId, BigDecimal top, BigDecimal skip) { + if (top == null) { + top = new BigDecimal(20); + } + if (skip == null) { + skip = new BigDecimal(0); + } + Optional todoList = todoListRepository.findById(listId); + if (todoList.isPresent()) { + return ResponseEntity.ok(todoItemRepository.findTodoItemsByTodoList(listId, PageRequest.of(skip.multiply(top).intValue(), top.intValue()))); + } else { + return ResponseEntity.notFound().build(); + } + } + + @Override + public ResponseEntity> getItemsByListIdAndState(String listId, TodoState state, BigDecimal top, BigDecimal skip) { + if (top == null) { + top = new BigDecimal(20); + } + if (skip == null) { + skip = new BigDecimal(0); + } + return ResponseEntity.ok( + todoItemRepository + .findTodoItemsByTodoListAndState(listId, state.name(), PageRequest.of(skip.multiply(top).intValue(), top.intValue()))); + } + + @Override + public ResponseEntity getListById(String listId) { + return todoListRepository.findById(listId).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + } + + @Override + public ResponseEntity> getLists(BigDecimal top, BigDecimal skip) { + if (top == null) { + top = new BigDecimal(20); + } + if (skip == null) { + skip = new BigDecimal(0); + } + return ResponseEntity.ok(todoListRepository.findAll(PageRequest.of(skip.multiply(top).intValue(), top.intValue())).toList()); + } + + @Override + public ResponseEntity updateItemById(String listId, String itemId, TodoItem todoItem) { + return getTodoItem(listId, itemId).map(t -> { + todoItemRepository.save(todoItem); + return ResponseEntity.ok(todoItem); + }).orElseGet(() -> ResponseEntity.notFound().build()); + } + + @Override + public ResponseEntity updateItemsStateByListId(String listId, TodoState state, List requestBody) { + for (TodoItem todoItem : todoItemRepository.findTodoItemsByTodoList(listId, Pageable.unpaged())) { + todoItem.state(state); + todoItemRepository.save(todoItem); + } + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } + + @Override + public ResponseEntity updateListById(String listId, TodoList todoList) { + return todoListRepository + .findById(listId) + .map(t -> ResponseEntity.ok(todoListRepository.save(t))) + .orElseGet(() -> ResponseEntity.badRequest().build()); + } + + private Optional getTodoItem(String listId, String itemId) { + Optional optionalTodoList = todoListRepository.findById(listId); + if (optionalTodoList.isEmpty()) { + return Optional.empty(); + } + Optional optionalTodoItem = todoItemRepository.findById(itemId); + if (optionalTodoItem.isPresent()) { + TodoItem todoItem = optionalTodoItem.get(); + if (todoItem.getListId().equals(listId)) { + return Optional.of(todoItem); + } else { + return Optional.empty(); + } + } else { + return Optional.empty(); + } + } +} diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties new file mode 100644 index 00000000000..4336ab6c05c --- /dev/null +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -0,0 +1,8 @@ +server.port=8080 + +spring.jackson.date-format=com.microsoft.azure.simpletodo.configuration.RFC3339DateFormat +spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false + +# The SPRING_DATA_MONGODB_URI should be configured in a .env file at the root of the project +spring.data.mongodb.uri=@SPRING_DATA_MONGODB_URI@ +spring.data.mongodb.database=todo diff --git a/templates/todo/api/java/src/main/resources/openapi.yaml b/templates/todo/api/java/src/main/resources/openapi.yaml new file mode 100644 index 00000000000..eb0401fbaeb --- /dev/null +++ b/templates/todo/api/java/src/main/resources/openapi.yaml @@ -0,0 +1,546 @@ +openapi: 3.0.0 +info: + contact: + email: wabrez@microsoft.com + description: Simple Todo API + title: Simple Todo API + version: 2.0.0 +servers: +- url: / +paths: + /lists: + get: + parameters: + - description: The max number of items to returns in a result + explode: true + in: query + name: top + required: false + schema: + type: number + style: form + - description: The number of items to skip within the results + explode: true + in: query + name: skip + required: false + schema: + type: number + style: form + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoList' + description: A Todo list result + summary: Gets an array of Todo lists + tags: + - Lists + x-accepts: application/json + x-tags: + - tag: Lists + post: + requestBody: + $ref: '#/components/requestBodies/TodoList' + responses: + "201": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoList' + description: A Todo list result + "400": + description: Invalid request schema + summary: Creates a new Todo list + tags: + - Lists + x-contentType: application/json + x-accepts: application/json + x-tags: + - tag: Lists + /lists/{listId}: + delete: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + responses: + "204": + description: Todo list deleted successfully + "404": + description: Todo list not found + summary: Deletes a Todo list by unique identifier + tags: + - Lists + x-accepts: application/json + x-tags: + - tag: Lists + get: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoList' + description: A Todo list result + "404": + description: Todo list not found + summary: Gets a Todo list by unique identifier + tags: + - Lists + x-accepts: application/json + x-tags: + - tag: Lists + put: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + requestBody: + $ref: '#/components/requestBodies/TodoList' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoList' + description: A Todo list result + "400": + description: Todo list is invalid + summary: Updates a Todo list by unique identifier + tags: + - Lists + x-contentType: application/json + x-accepts: application/json + x-tags: + - tag: Lists + /lists/{listId}/items: + get: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + - description: The max number of items to returns in a result + explode: true + in: query + name: top + required: false + schema: + type: number + style: form + - description: The number of items to skip within the results + explode: true + in: query + name: skip + required: false + schema: + type: number + style: form + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/TodoList' + type: array + description: An array of Todo lists + "404": + description: Todo list not found + summary: Gets Todo items within the specified list + tags: + - Items + x-accepts: application/json + x-tags: + - tag: Items + post: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + requestBody: + $ref: '#/components/requestBodies/TodoItem' + responses: + "201": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + description: A Todo item result + "404": + description: Todo list not found + summary: Creates a new Todo item within a list + tags: + - Items + x-contentType: application/json + x-accepts: application/json + x-tags: + - tag: Items + /lists/{listId}/items/{itemId}: + delete: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + - description: The Todo list unique identifier + explode: false + in: path + name: itemId + required: true + schema: + type: string + style: simple + responses: + "204": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + description: A Todo item result + "404": + description: Todo list or item not found + summary: Deletes a Todo item by unique identifier + tags: + - Items + x-accepts: application/json + x-tags: + - tag: Items + get: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + - description: The Todo list unique identifier + explode: false + in: path + name: itemId + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + description: A Todo item result + "404": + description: Todo list or item not found + summary: Gets a Todo item by unique identifier + tags: + - Items + x-accepts: application/json + x-tags: + - tag: Items + put: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + - description: The Todo list unique identifier + explode: false + in: path + name: itemId + required: true + schema: + type: string + style: simple + requestBody: + $ref: '#/components/requestBodies/TodoItem' + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + description: A Todo item result + "400": + description: Todo item is invalid + "404": + description: Todo list or item not found + summary: Updates a Todo item by unique identifier + tags: + - Items + x-contentType: application/json + x-accepts: application/json + x-tags: + - tag: Items + /lists/{listId}/items/state/{state}: + get: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + - description: The Todo item state + explode: false + in: path + name: state + required: true + schema: + $ref: '#/components/schemas/TodoState' + style: simple + - description: The max number of items to returns in a result + explode: true + in: query + name: top + required: false + schema: + type: number + style: form + - description: The number of items to skip within the results + explode: true + in: query + name: skip + required: false + schema: + type: number + style: form + responses: + "200": + content: + application/json: + schema: + items: + $ref: '#/components/schemas/TodoItem' + type: array + description: An array of Todo items + "404": + description: Todo list or item not found + summary: Gets a list of Todo items of a specific state + tags: + - Items + x-accepts: application/json + x-tags: + - tag: Items + put: + parameters: + - description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + - description: The Todo item state + explode: false + in: path + name: state + required: true + schema: + $ref: '#/components/schemas/TodoState' + style: simple + requestBody: + content: + application/json: + schema: + items: + description: The Todo item unique identifier + type: string + type: array + responses: + "204": + description: Todo items updated + "400": + description: Update request is invalid + summary: Changes the state of the specified list items + tags: + - Items + x-contentType: application/json + x-accepts: application/json + x-tags: + - tag: Items +components: + parameters: + listId: + description: The Todo list unique identifier + explode: false + in: path + name: listId + required: true + schema: + type: string + style: simple + itemId: + description: The Todo list unique identifier + explode: false + in: path + name: itemId + required: true + schema: + type: string + style: simple + state: + description: The Todo item state + explode: false + in: path + name: state + required: true + schema: + $ref: '#/components/schemas/TodoState' + style: simple + top: + description: The max number of items to returns in a result + explode: true + in: query + name: top + required: false + schema: + type: number + style: form + skip: + description: The number of items to skip within the results + explode: true + in: query + name: skip + required: false + schema: + type: number + style: form + requestBodies: + TodoList: + content: + application/json: + schema: + $ref: '#/components/schemas/TodoList' + description: The Todo List + TodoItem: + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + description: The Todo Item + responses: + TodoList: + content: + application/json: + schema: + $ref: '#/components/schemas/TodoList' + description: A Todo list result + TodoListArray: + content: + application/json: + schema: + items: + $ref: '#/components/schemas/TodoList' + type: array + description: An array of Todo lists + TodoItem: + content: + application/json: + schema: + $ref: '#/components/schemas/TodoItem' + description: A Todo item result + TodoItemArray: + content: + application/json: + schema: + items: + $ref: '#/components/schemas/TodoItem' + type: array + description: An array of Todo items + schemas: + TodoItem: + description: A task that needs to be completed + example: + listId: listId + dueDate: 2000-01-23T04:56:07.000+00:00 + name: name + description: description + id: id + completedDate: 2000-01-23T04:56:07.000+00:00 + properties: + id: + type: string + listId: + type: string + name: + type: string + description: + type: string + state: + $ref: '#/components/schemas/TodoState' + dueDate: + format: date-time + type: string + completedDate: + format: date-time + type: string + required: + - description + - listId + - name + type: object + TodoList: + description: ' A list of related Todo items' + example: + name: name + description: description + id: id + properties: + id: + type: string + name: + type: string + description: + type: string + required: + - name + type: object + TodoState: + enum: + - todo + - inprogress + - done + type: string diff --git a/templates/todo/api/java/src/test/java/com/microsoft/azure/simpletodo/SimpleTodoApplicationTests.java b/templates/todo/api/java/src/test/java/com/microsoft/azure/simpletodo/SimpleTodoApplicationTests.java new file mode 100644 index 00000000000..7e373c79969 --- /dev/null +++ b/templates/todo/api/java/src/test/java/com/microsoft/azure/simpletodo/SimpleTodoApplicationTests.java @@ -0,0 +1,13 @@ +package com.microsoft.azure.simpletodo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class SimpleTodoApplicationTests { + + @Test + void contextLoads() { + } + +} From ebbbc2dd5c0231b9b02a918681a35ab7ca829dc2 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 12 Sep 2022 10:03:22 -0700 Subject: [PATCH 02/41] local deployment changes --- templates/todo/api/java/pom.xml | 2 +- .../azure/simpletodo/configuration/WebConfiguration.java | 2 +- .../todo/api/java/src/main/resources/application.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/todo/api/java/pom.xml b/templates/todo/api/java/pom.xml index b3825bac781..cfb71851404 100644 --- a/templates/todo/api/java/pom.xml +++ b/templates/todo/api/java/pom.xml @@ -13,7 +13,7 @@ Simple Todo application tmp-judubois-1111 - 17 + 18 ${java.version} ${java.version} 1.6.4 diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java index e898508a60d..191fa0b6d82 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/configuration/WebConfiguration.java @@ -17,7 +17,7 @@ public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") - .allowedHeaders("Content-Type"); + .allowedHeaders("*"); } }; } diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index 4336ab6c05c..4954cb4e575 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.port=8080 +server.port=3100 spring.jackson.date-format=com.microsoft.azure.simpletodo.configuration.RFC3339DateFormat spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false From 69dab16f81b30f846cba865ae0f3d0107830d9c5 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 12 Sep 2022 10:09:18 -0700 Subject: [PATCH 03/41] Switch to AZURE_COSMOS_CONNECTION_STRING --- templates/todo/api/java/README.md | 6 +++--- .../todo/api/java/src/main/resources/application.properties | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/templates/todo/api/java/README.md b/templates/todo/api/java/README.md index 77c9ee48f47..57a77b30752 100644 --- a/templates/todo/api/java/README.md +++ b/templates/todo/api/java/README.md @@ -10,7 +10,7 @@ Create a `.env` with the following configuration: -- `SPRING_DATA_MONGODB_URI` - Cosmos DB connection string (Mongo DB also supported) +- `AZURE_COSMOS_CONNECTION_STRING` - Cosmos DB connection string (Mongo DB also supported) ### Build & Compile @@ -28,9 +28,9 @@ Run `./mvnw spring-boot:build-image` to build the Docker image. ### Run the Docker image -The environment variable `SPRING_DATA_MONGODB_URI` must point to the Cosmos DB connection string. +The environment variable `AZURE_COSMOS_CONNECTION_STRING` must point to the Cosmos DB connection string. -Run `docker run -it -p 8080:8080 -e SPRING_DATA_MONGODB_URI=$SPRING_DATA_MONGODB_URI azure/azure-dev-todo-java` to start the Docker image. +Run `docker run -it -p 8080:8080 -e AZURE_COSMOS_CONNECTION_STRING=$AZURE_COSMOS_CONNECTION_STRING azure/azure-dev-todo-java` to start the Docker image. ## Deploy to Azure App Service using Maven diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index 4954cb4e575..a7ef54310a2 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -3,6 +3,6 @@ server.port=3100 spring.jackson.date-format=com.microsoft.azure.simpletodo.configuration.RFC3339DateFormat spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false -# The SPRING_DATA_MONGODB_URI should be configured in a .env file at the root of the project -spring.data.mongodb.uri=@SPRING_DATA_MONGODB_URI@ +# The AZURE_COSMOS_CONNECTION_STRING key should be configured in a .env file at the root of the project +spring.data.mongodb.uri=@AZURE_COSMOS_CONNECTION_STRING@ spring.data.mongodb.database=todo From fffb639065ab0e6fd0f24e447c8e5ba7567ec434 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 12 Sep 2022 10:24:46 -0700 Subject: [PATCH 04/41] add ci mention --- templates/todo/web/react-fluent/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/todo/web/react-fluent/README.md b/templates/todo/web/react-fluent/README.md index b1ebbab5a1a..de82c44353c 100644 --- a/templates/todo/web/react-fluent/README.md +++ b/templates/todo/web/react-fluent/README.md @@ -13,6 +13,10 @@ Create a `.env` file within the base of the `reactd-fluent` folder with the foll In the project directory, you can run: +### `npm ci` + +Installs local pre-requisites. + ### `npm start` Runs the app in the development mode. From 49889eb864405693718423e9cc80a1116cfe4332 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 12 Sep 2022 10:40:11 -0700 Subject: [PATCH 05/41] Add java template --- .../todo/projects/java-mongo-aca/README.md | 232 ++++++++++++++++++ .../todo/projects/java-mongo-aca/azure.yaml | 14 ++ .../todo/projects/java-mongo-aca/repo.yaml | 92 +++++++ 3 files changed, 338 insertions(+) create mode 100644 templates/todo/projects/java-mongo-aca/README.md create mode 100644 templates/todo/projects/java-mongo-aca/azure.yaml create mode 100644 templates/todo/projects/java-mongo-aca/repo.yaml diff --git a/templates/todo/projects/java-mongo-aca/README.md b/templates/todo/projects/java-mongo-aca/README.md new file mode 100644 index 00000000000..660b8e16325 --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/README.md @@ -0,0 +1,232 @@ +# ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure Container Apps + +[![Open in Remote - Containers](https://img.shields.io/static/v1?label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/todo-java-mongo-aca) + +A complete ToDo application that includes everything you need to build, deploy, and monitor an Azure solution. This application uses the Azure Developer CLI (azd) to get you up and running on Azure quickly, React.js for the Web application, Java for the API, Azure Cosmos DB API for MongoDB for storage, and Azure Monitor for monitoring and logging. It includes application code, tools, and pipelines that serve as a foundation from which you can build upon and customize when creating your own solutions. + +Let's jump in and get the ToDo app up and running in Azure. When you are finished, you will have a fully functional web app deployed on Azure. In later steps, you'll see how to setup a pipeline and monitor the application. + +Screenshot of deployed ToDo app + +Screenshot of the deployed ToDo app + +### Prerequisites + +The following prerequisites are required to use this application. Please ensure that you have them all installed locally. + +- [Azure Developer CLI](https://aka.ms/azure-dev/install) + - Windows: + ```powershell + powershell -ex AllSigned -c "Invoke-RestMethod 'https://aka.ms/install-azd.ps1' | Invoke-Expression" + ``` + - Linux/MacOS: + ``` + curl -fsSL https://aka.ms/install-azd.sh | bash + ``` +- [Azure CLI (2.38.0+)](https://docs.microsoft.com/cli/azure/install-azure-cli) +- [Java 18 or later](https://jdk.java.net/) - for API backend +- [Node.js with npm (16.13.1+)](https://nodejs.org/) - for the Web frontend +- [Docker](https://docs.docker.com/get-docker/) +- [Git (2.36.1+)](https://git-scm.com/) + +### Quickstart + +The fastest way for you to get this application up and running on Azure is to use the `azd up` command. This single command will create and configure all necessary Azure resources - including access policies and roles for your account and service-to-service communication with Managed Identities. + +1. Open a terminal, create a new empty folder, and change into it. +1. Run the following command to initialize the project, provision Azure resources, and deploy the application code. + +```bash +azd up --template todo-java-mongo-aca +``` + +You will be prompted for the following information: + +- `Environment Name`: This will be used as a prefix for the resource group that will be created to hold all Azure resources. This name should be unique within your Azure subscription. +- `Azure Location`: The Azure location where your resources will be deployed. +- `Azure Subscription`: The Azure Subscription where your resources will be deployed. + +> NOTE: This template may only be used with the following Azure locations: +> +> - Australia East +> - Brazil South +> - Canada Central +> - Central US +> - East Asia +> - East US +> - East US 2 +> - Germany West Central +> - Japan East +> - Korea Central +> - North Central US +> - North Europe +> - South Central US +> - UK South +> - West Europe +> - West US +> +> If you attempt to use the template with an unsupported region, the provision step will fail. + +> NOTE: This may take a while to complete as it executes three commands: `azd init` (initializes environment), `azd provision` (provisions Azure resources), and `azd deploy` (deploys application code). You will see a progress indicator as it provisions and deploys your application. + +When `azd up` is complete it will output the following URLs: + +- Azure Portal link to view resources +- ToDo Web application frontend +- ToDo API application + +!["azd up output"](assets/urls.png) + +Click the web application URL to launch the ToDo app. Create a new collection and add some items. This will create monitoring activity in the application that you will be able to see later when you run `azd monitor`. + +> NOTE: +> +> - The `azd up` command will create Azure resources that will incur costs to your Azure subscription. You can clean up those resources manually via the Azure portal or with the `azd down` command. +> - You can call `azd up` as many times as you like to both provision and deploy your solution, but you only need to provide the `--template` parameter the first time you call it to get the code locally. Subsequent `azd up` calls do not require the template parameter. If you do provide the parameter, all your local source code will be overwritten if you agree to overwrite when prompted. +> - You can always create a new environment with `azd env new`. + +### Application Architecture + +This application utilizes the following Azure resources: + +- [**Azure Container Apps**](https://docs.microsoft.com/azure/container-apps/) to host the Web frontend and API backend +- [**Azure Cosmos DB API for MongoDB**](https://docs.microsoft.com/azure/cosmos-db/mongodb/mongodb-introduction) for storage +- [**Azure Monitor**](https://docs.microsoft.com/azure/azure-monitor/) for monitoring and logging +- [**Azure Key Vault**](https://docs.microsoft.com/azure/key-vault/) for securing secrets + +Here's a high level architecture diagram that illustrates these components. Notice that these are all contained within a single [resource group](https://docs.microsoft.com/azure/azure-resource-manager/management/manage-resource-groups-portal), that will be created for you when you create the resources. + +Application architecture diagram + +> This template provisions resources to an Azure subscription that you will select upon provisioning them. Please refer to the [Pricing calculator for Microsoft Azure](https://azure.microsoft.com/pricing/calculator/) and, if needed, update the included Azure resource definitions found in `infra/main.bicep` to suit your needs. + +### Application Code + +The repo is structured to follow the [Azure Developer CLI](https://aka.ms/azure-dev/overview) conventions including: + +- **Source Code**: All application source code is located in the `src` folder. +- **Infrastructure as Code**: All application "infrastructure as code" files are located in the `infra` folder. +- **Azure Developer Configuration**: An `azure.yaml` file located in the root that ties the application source code to the Azure services defined in your "infrastructure as code" files. +- **GitHub Actions**: A sample GitHub action file is located in the `.github/workflows` folder. +- **VS Code Configuration**: All VS Code configuration to run and debug the application is located in the `.vscode` folder. + +### Azure Subscription + +This template will create infrastructure and deploy code to Azure. If you don't have an Azure Subscription, you can sign up for a [free account here](https://azure.microsoft.com/free/). + +### Azure Developer CLI - VS Code Extension + +The Azure Developer experience includes an Azure Developer CLI VS Code Extension that mirrors all of the Azure Developer CLI commands into the `azure.yaml` context menu and command palette options. If you are a VS Code user, then we highly recommend installing this extension for the best experience. + +Here's how to install it: + +#### VS Code + +1. Click on the "Extensions" tab in VS Code +1. Search for "Azure Developer CLI" - authored by Microsoft +1. Click "Install" + +#### Marketplace + +1. Go to the [Azure Developer CLI - VS Code Extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.azure-dev) page +1. Click "Install" + +Once the extension is installed, you can press `F1`, and type "Azure Developer CLI" to see all of your available options. You can also right click on your project's `azure.yaml` file for a list of commands. + +### Next Steps + +At this point, you have a complete application deployed on Azure. But there is much more that the Azure Developer CLI can do. These next steps will introduce you to additional commands that will make creating applications on Azure much easier. Using the Azure Developer CLI, you can setup your pipelines, monitor your application, test and debug locally. + +#### Set up a pipeline using `azd pipeline` + +This template includes a GitHub Actions pipeline configuration file that will deploy your application whenever code is pushed to the main branch. You can find that pipeline file here: `.github/workflows`. + +Setting up this pipeline requires you to give GitHub permission to deploy to Azure on your behalf, which is done via a Service Principal stored in a GitHub secret named `AZURE_CREDENTIALS`. The `azd pipeline config` command will automatically create a service principal for you. The command also helps to create a private GitHub repository and pushes code to the newly created repo. + +Before you call the `azd pipeline config` command, you'll need to install the following: + +- [GitHub CLI (2.3+)](https://github.com/cli/cli) + +Run the following command to set up a GitHub Action: + +```bash +azd pipeline config +``` + +> Support for Azure DevOps Pipelines is coming soon to `azd pipeline config`. In the meantime, you can follow the instructions found here: [.azdo/pipelines/README.md](./.azdo/pipelines/README.md) to set it up manually. + +#### Monitor the application using `azd monitor` + +To help with monitoring applications, the Azure Dev CLI provides a `monitor` command to help you get to the various Application Insights dashboards. + +- Run the following command to open the "Overview" dashboard: + + ```bash + azd monitor --overview + ``` + +- Live Metrics Dashboard + + Run the following command to open the "Live Metrics" dashboard: + + ```bash + azd monitor --live + ``` + +- Logs Dashboard + + Run the following command to open the "Logs" dashboard: + + ```bash + azd monitor --logs + ``` + +#### Run and Debug Locally + +The easiest way to run and debug is to leverage the Azure Developer CLI Visual Studio Code Extension. Refer to this [walk-through](https://aka.ms/azure-dev/vscode) for more details. + +#### Clean up resources + +When you are done, you can delete all the Azure resources created with this template by running the following command: + +```bash +azd down +``` + +### Additional azd commands + +The Azure Developer CLI includes many other commands to help with your Azure development experience. You can view these commands at the terminal by running `azd help`. You can also view the full list of commands on our [Azure Developer CLI command](https://aka.ms/azure-dev/ref) page. + +## Troubleshooting/Known issues + +Sometimes, things go awry. If you happen to run into issues, then please review our ["Known Issues"](https://aka.ms/azure-dev/knownissues) page for help. If you continue to have issues, then please file an issue in our main [Azure Dev](https://aka.ms/azure-dev/issues) repository. + +## Security + +### Roles + +This template creates a [managed identity](https://docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview) for your app inside your Azure Active Directory tenant, and it is used to authenticate your app with Azure and other services that support Azure AD authentication like Key Vault via access policies. You will see principalId referenced in the infrastructure as code files, that refers to the id of the currently logged in Azure CLI user, which will be granted access policies and permissions to run the application locally. To view your managed identity in the Azure Portal, follow these [steps](https://docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/how-to-view-managed-identity-service-principal-portal). + +### Key Vault + +This template uses [Azure Key Vault](https://docs.microsoft.com/azure/key-vault/general/overview) to securely store your Cosmos DB connection string for the provisioned Cosmos DB account. Key Vault is a cloud service for securely storing and accessing secrets (API keys, passwords, certificates, cryptographic keys) and makes it simple to give other Azure services access to them. As you continue developing your solution, you may add as many secrets to your Key Vault as you require. + +## Uninstall + +To uninstall the Azure Developer CLI: + +Windows: + +``` +powershell -ex AllSigned -c "Invoke-RestMethod 'https://aka.ms/uninstall-azd.ps1' | Invoke-Expression" +``` + +Linux/MacOS: + +``` +curl -fsSL https://aka.ms/uninstall-azd.sh | bash +``` + +## Reporting Issues and Feedback + +If you have any feature requests, issues, or areas for improvement, please [file an issue](https://aka.ms/azure-dev/issues). To keep up-to-date, ask questions, or share suggestions, join our [GitHub Discussions](https://aka.ms/azure-dev/discussions). You may also contact us via AzDevTeam@microsoft.com. diff --git a/templates/todo/projects/java-mongo-aca/azure.yaml b/templates/todo/projects/java-mongo-aca/azure.yaml new file mode 100644 index 00000000000..01a061f819c --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/azure.yaml @@ -0,0 +1,14 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json + +name: todo-java-mongo-aca +metadata: + template: todo-java-mongo-aca@0.0.1-beta +services: + api: + project: src/api + language: java + host: containerapp + web: + project: src/web + language: js + host: containerapp diff --git a/templates/todo/projects/java-mongo-aca/repo.yaml b/templates/todo/projects/java-mongo-aca/repo.yaml new file mode 100644 index 00000000000..b79f94c2646 --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/repo.yaml @@ -0,0 +1,92 @@ +templateApi: 1.0.0 +metadata: + type: repo + name: todo-java-mongo-aca + description: ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure Container Apps + +repo: + includeProjectAssets: true + + remotes: + - name: azure-samples-main + url: git@github.com:Azure-Samples/todo-java-mongo-aca.git + - name: azure-samples-staging + url: git@github.com:Azure-Samples/todo-java-mongo-aca.git + branch: staging + + rewrite: + rules: + - from: ../../../../../common/infra/bicep + to: ./ + patterns: + - "**/*.bicep" + + - from: ../../api/js + to: ./src/api + patterns: + - "**/azure.@(yml|yaml)" + + - from: ../../web/react-fluent + to: ./src/web + patterns: + - "**/azure.@(yml|yaml)" + + assets: + # Common assets + + # openapi.yaml to root + - from: ../../api/common + to: ./ + patterns: + - openapi.yaml + + # openapi.yaml to api root + - from: ../../api/common + to: ./src/api + patterns: + - openapi.yaml + + # Templates common + - from: ../../../common + to: ./ + ignore: + - .devcontainer/**/* + - "infra/**/*" + + - from: ../../../common/infra/bicep + to: ./infra + + + # .devcontainer common (devcontainer.json) + # - from: ../../../common/.devcontainer/devcontainer.json/nodejs + # to: ./.devcontainer + + # # .devcontainer common (Dockerfile) + # - from: ../../../common/.devcontainer/Dockerfile/base + # to: ./.devcontainer + + # Assets common + - from: ../../common/assets + to: ./assets + + # Tests common + - from: ../../common/tests + to: ./tests + + # ACA infra common + - from: ../../common/infra/aca/bicep + to: ./infra + + # Java API + - from: ../../api/java + to: ./src/api + ignore: + - "target/**/*" + - .env + + # React Frontend + - from: ../../web/react-fluent + to: ./src/web + ignore: + - "build/**/*" + - "node_modules/**/*" From 3a09bf3d0498bbca5e0864c7398589dda8fea372 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 12 Sep 2022 10:41:01 -0700 Subject: [PATCH 06/41] remove openapi --- .../api/java/src/main/resources/openapi.yaml | 546 ------------------ 1 file changed, 546 deletions(-) delete mode 100644 templates/todo/api/java/src/main/resources/openapi.yaml diff --git a/templates/todo/api/java/src/main/resources/openapi.yaml b/templates/todo/api/java/src/main/resources/openapi.yaml deleted file mode 100644 index eb0401fbaeb..00000000000 --- a/templates/todo/api/java/src/main/resources/openapi.yaml +++ /dev/null @@ -1,546 +0,0 @@ -openapi: 3.0.0 -info: - contact: - email: wabrez@microsoft.com - description: Simple Todo API - title: Simple Todo API - version: 2.0.0 -servers: -- url: / -paths: - /lists: - get: - parameters: - - description: The max number of items to returns in a result - explode: true - in: query - name: top - required: false - schema: - type: number - style: form - - description: The number of items to skip within the results - explode: true - in: query - name: skip - required: false - schema: - type: number - style: form - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoList' - description: A Todo list result - summary: Gets an array of Todo lists - tags: - - Lists - x-accepts: application/json - x-tags: - - tag: Lists - post: - requestBody: - $ref: '#/components/requestBodies/TodoList' - responses: - "201": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoList' - description: A Todo list result - "400": - description: Invalid request schema - summary: Creates a new Todo list - tags: - - Lists - x-contentType: application/json - x-accepts: application/json - x-tags: - - tag: Lists - /lists/{listId}: - delete: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - responses: - "204": - description: Todo list deleted successfully - "404": - description: Todo list not found - summary: Deletes a Todo list by unique identifier - tags: - - Lists - x-accepts: application/json - x-tags: - - tag: Lists - get: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoList' - description: A Todo list result - "404": - description: Todo list not found - summary: Gets a Todo list by unique identifier - tags: - - Lists - x-accepts: application/json - x-tags: - - tag: Lists - put: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - requestBody: - $ref: '#/components/requestBodies/TodoList' - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoList' - description: A Todo list result - "400": - description: Todo list is invalid - summary: Updates a Todo list by unique identifier - tags: - - Lists - x-contentType: application/json - x-accepts: application/json - x-tags: - - tag: Lists - /lists/{listId}/items: - get: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - - description: The max number of items to returns in a result - explode: true - in: query - name: top - required: false - schema: - type: number - style: form - - description: The number of items to skip within the results - explode: true - in: query - name: skip - required: false - schema: - type: number - style: form - responses: - "200": - content: - application/json: - schema: - items: - $ref: '#/components/schemas/TodoList' - type: array - description: An array of Todo lists - "404": - description: Todo list not found - summary: Gets Todo items within the specified list - tags: - - Items - x-accepts: application/json - x-tags: - - tag: Items - post: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - requestBody: - $ref: '#/components/requestBodies/TodoItem' - responses: - "201": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoItem' - description: A Todo item result - "404": - description: Todo list not found - summary: Creates a new Todo item within a list - tags: - - Items - x-contentType: application/json - x-accepts: application/json - x-tags: - - tag: Items - /lists/{listId}/items/{itemId}: - delete: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - - description: The Todo list unique identifier - explode: false - in: path - name: itemId - required: true - schema: - type: string - style: simple - responses: - "204": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoItem' - description: A Todo item result - "404": - description: Todo list or item not found - summary: Deletes a Todo item by unique identifier - tags: - - Items - x-accepts: application/json - x-tags: - - tag: Items - get: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - - description: The Todo list unique identifier - explode: false - in: path - name: itemId - required: true - schema: - type: string - style: simple - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoItem' - description: A Todo item result - "404": - description: Todo list or item not found - summary: Gets a Todo item by unique identifier - tags: - - Items - x-accepts: application/json - x-tags: - - tag: Items - put: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - - description: The Todo list unique identifier - explode: false - in: path - name: itemId - required: true - schema: - type: string - style: simple - requestBody: - $ref: '#/components/requestBodies/TodoItem' - responses: - "200": - content: - application/json: - schema: - $ref: '#/components/schemas/TodoItem' - description: A Todo item result - "400": - description: Todo item is invalid - "404": - description: Todo list or item not found - summary: Updates a Todo item by unique identifier - tags: - - Items - x-contentType: application/json - x-accepts: application/json - x-tags: - - tag: Items - /lists/{listId}/items/state/{state}: - get: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - - description: The Todo item state - explode: false - in: path - name: state - required: true - schema: - $ref: '#/components/schemas/TodoState' - style: simple - - description: The max number of items to returns in a result - explode: true - in: query - name: top - required: false - schema: - type: number - style: form - - description: The number of items to skip within the results - explode: true - in: query - name: skip - required: false - schema: - type: number - style: form - responses: - "200": - content: - application/json: - schema: - items: - $ref: '#/components/schemas/TodoItem' - type: array - description: An array of Todo items - "404": - description: Todo list or item not found - summary: Gets a list of Todo items of a specific state - tags: - - Items - x-accepts: application/json - x-tags: - - tag: Items - put: - parameters: - - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - - description: The Todo item state - explode: false - in: path - name: state - required: true - schema: - $ref: '#/components/schemas/TodoState' - style: simple - requestBody: - content: - application/json: - schema: - items: - description: The Todo item unique identifier - type: string - type: array - responses: - "204": - description: Todo items updated - "400": - description: Update request is invalid - summary: Changes the state of the specified list items - tags: - - Items - x-contentType: application/json - x-accepts: application/json - x-tags: - - tag: Items -components: - parameters: - listId: - description: The Todo list unique identifier - explode: false - in: path - name: listId - required: true - schema: - type: string - style: simple - itemId: - description: The Todo list unique identifier - explode: false - in: path - name: itemId - required: true - schema: - type: string - style: simple - state: - description: The Todo item state - explode: false - in: path - name: state - required: true - schema: - $ref: '#/components/schemas/TodoState' - style: simple - top: - description: The max number of items to returns in a result - explode: true - in: query - name: top - required: false - schema: - type: number - style: form - skip: - description: The number of items to skip within the results - explode: true - in: query - name: skip - required: false - schema: - type: number - style: form - requestBodies: - TodoList: - content: - application/json: - schema: - $ref: '#/components/schemas/TodoList' - description: The Todo List - TodoItem: - content: - application/json: - schema: - $ref: '#/components/schemas/TodoItem' - description: The Todo Item - responses: - TodoList: - content: - application/json: - schema: - $ref: '#/components/schemas/TodoList' - description: A Todo list result - TodoListArray: - content: - application/json: - schema: - items: - $ref: '#/components/schemas/TodoList' - type: array - description: An array of Todo lists - TodoItem: - content: - application/json: - schema: - $ref: '#/components/schemas/TodoItem' - description: A Todo item result - TodoItemArray: - content: - application/json: - schema: - items: - $ref: '#/components/schemas/TodoItem' - type: array - description: An array of Todo items - schemas: - TodoItem: - description: A task that needs to be completed - example: - listId: listId - dueDate: 2000-01-23T04:56:07.000+00:00 - name: name - description: description - id: id - completedDate: 2000-01-23T04:56:07.000+00:00 - properties: - id: - type: string - listId: - type: string - name: - type: string - description: - type: string - state: - $ref: '#/components/schemas/TodoState' - dueDate: - format: date-time - type: string - completedDate: - format: date-time - type: string - required: - - description - - listId - - name - type: object - TodoList: - description: ' A list of related Todo items' - example: - name: name - description: description - id: id - properties: - id: - type: string - name: - type: string - description: - type: string - required: - - name - type: object - TodoState: - enum: - - todo - - inprogress - - done - type: string From a3779828693cb869370b9a30088fb454019be9f4 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 12 Sep 2022 15:52:21 -0700 Subject: [PATCH 07/41] Project code changes --- .../pkg/project/framework_service_maven.go | 49 ++++++ cli/azd/pkg/project/service_config.go | 2 + cli/azd/pkg/tools/maven/maven.go | 161 ++++++++++++++++++ 3 files changed, 212 insertions(+) create mode 100644 cli/azd/pkg/project/framework_service_maven.go create mode 100644 cli/azd/pkg/tools/maven/maven.go diff --git a/cli/azd/pkg/project/framework_service_maven.go b/cli/azd/pkg/project/framework_service_maven.go new file mode 100644 index 00000000000..0c195e9d9cf --- /dev/null +++ b/cli/azd/pkg/project/framework_service_maven.go @@ -0,0 +1,49 @@ +package project + +import ( + "context" + "path/filepath" + + "github.com/azure/azure-dev/cli/azd/pkg/environment" + "github.com/azure/azure-dev/cli/azd/pkg/tools" + "github.com/azure/azure-dev/cli/azd/pkg/tools/maven" +) + +type mavenProject struct { + config *ServiceConfig + env *environment.Environment + mavenCli maven.MavenCli +} + +func (m *mavenProject) RequiredExternalTools() []tools.ExternalTool { + return []tools.ExternalTool{m.mavenCli} +} + +func (m *mavenProject) Package(ctx context.Context, progress chan<- string) (string, error) { + progress <- "Creating deployment package" + if err := m.mavenCli.Package(ctx, m.config.Path()); err != nil { + return "", err + } + + return filepath.Join(m.config.Path(), "target"), nil +} + +func (m *mavenProject) InstallDependencies(ctx context.Context) error { + if err := m.mavenCli.ResolveDependencies(ctx, m.config.Path()); err != nil { + return err + } + + return nil +} + +func (m *mavenProject) Initialize(ctx context.Context) error { + return nil +} + +func NewMavenProject(ctx context.Context, config *ServiceConfig, env *environment.Environment) FrameworkService { + return &mavenProject{ + config: config, + env: env, + mavenCli: maven.NewMavenCli(ctx), + } +} diff --git a/cli/azd/pkg/project/service_config.go b/cli/azd/pkg/project/service_config.go index d71bc06534b..647dc5c7a85 100644 --- a/cli/azd/pkg/project/service_config.go +++ b/cli/azd/pkg/project/service_config.go @@ -108,6 +108,8 @@ func (sc *ServiceConfig) GetFrameworkService(ctx context.Context, env *environme frameworkService = NewPythonProject(ctx, sc, env) case "js", "ts": frameworkService = NewNpmProject(ctx, sc, env) + case "java": + frameworkService = NewMavenProject(ctx, sc, env) default: return nil, fmt.Errorf("unsupported language '%s' for service '%s'", sc.Language, sc.Name) } diff --git a/cli/azd/pkg/tools/maven/maven.go b/cli/azd/pkg/tools/maven/maven.go new file mode 100644 index 00000000000..62fb6951e02 --- /dev/null +++ b/cli/azd/pkg/tools/maven/maven.go @@ -0,0 +1,161 @@ +package maven + +import ( + "context" + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + + osexec "os/exec" + + "github.com/azure/azure-dev/cli/azd/pkg/exec" + "github.com/azure/azure-dev/cli/azd/pkg/tools" + "github.com/blang/semver/v4" +) + +type MavenCli interface { + tools.ExternalTool + Package(ctx context.Context, projectPath string) error + ResolveDependencies(ctx context.Context, projectPath string) error +} + +type mavenCli struct { + commandRunner exec.CommandRunner +} + +func (m *mavenCli) Name() string { + return "Maven" +} + +func (m *mavenCli) InstallUrl() string { + return "https://maven.apache.org" +} + +func (m *mavenCli) jdkVersionInfo() tools.VersionInfo { + return tools.VersionInfo{ + MinimumVersion: semver.Version{ + Major: 17, + Minor: 0, + Patch: 0}, + UpdateCommand: "Visit https://jdk.java.net/ to upgrade", + } +} + +func (m *mavenCli) CheckInstalled(ctx context.Context) (bool, error) { + javac, err := getJavaCompilerPath() + if err != nil { + return false, fmt.Errorf("checking java jdk installation: %s", err) + } + + res, err := tools.ExecuteCommand(ctx, javac, "--version") + if err != nil { + return false, fmt.Errorf("checking javac version: %w", err) + } + + javaSemver, err := tools.ExtractSemver(res) + if err != nil { + return false, fmt.Errorf("converting to semver version fails: %w", err) + } + + updateDetail := m.jdkVersionInfo() + if javaSemver.LT(updateDetail.MinimumVersion) { + return false, &tools.ErrSemver{ToolName: "Java JDK", VersionInfo: m.jdkVersionInfo()} + } + + return true, nil +} + +func getJavaCompilerPath() (string, error) { + javac := "javac" + path, err := osexec.LookPath(javac) + if err == nil { + return path, nil + } + + if !errors.Is(err, osexec.ErrNotFound) { + return "", err + } + + home := os.Getenv("JAVA_HOME") + if home == "" { + return "", errors.New("java JDK not installed") + } + + absPath := filepath.Join(home, "bin", pathOptionalExt(javac, ".exe")) + _, err = os.Stat(absPath) + if err == nil { + return absPath, nil + } + + if errors.Is(err, osexec.ErrNotFound) { + return "", fmt.Errorf("javac could not be found under JAVA_HOME directory. Expected javac to be present at: %s", absPath) + } + + return "", err +} + +func pathOptionalExt(executable string, ext string) string { + if runtime.GOOS == "windows" { + return executable + ext + } else { + return executable + } +} + +func getMavenPath(projectPath string) (string, error) { + mvnw, ok := getMavenWrapperPath(projectPath) + if ok { + return mvnw, nil + } + + mvn, err := osexec.LookPath("mvn") + if err != nil { + return "", err + } + + return mvn, nil +} + +func getMavenWrapperPath(projectPath string) (string, bool) { + mvnw := pathOptionalExt(filepath.Join(projectPath, "mvnw"), ".cmd") + if _, err := os.Stat(mvnw); err != nil { + return "", false + } + + return mvnw, true +} + +func (cli *mavenCli) Package(ctx context.Context, projectPath string) error { + mvn, err := getMavenPath(projectPath) + if err != nil { + return err + } + runArgs := exec.NewRunArgs(mvn, "package").WithCwd(projectPath) + res, err := cli.commandRunner.Run(ctx, runArgs) + if err != nil { + return fmt.Errorf("mvn package on project '%s' failed: %s: %w", projectPath, res.String(), err) + } + return nil +} + +func (cli *mavenCli) ResolveDependencies(ctx context.Context, projectPath string) error { + mvn, err := getMavenPath(projectPath) + if err != nil { + return err + } + + runArgs := exec.NewRunArgs(mvn, "dependency:resolve").WithCwd(projectPath) + res, err := cli.commandRunner.Run(ctx, runArgs) + if err != nil { + return fmt.Errorf("mvn dependency:resolve on project '%s' failed: %s: %w", projectPath, res.String(), err) + } + return nil +} + +func NewMavenCli(ctx context.Context) MavenCli { + return &mavenCli{ + commandRunner: exec.GetCommandRunner(ctx), + } +} From 5c9490a447045bb7369c8d20e85042cda7aab411 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Tue, 13 Sep 2022 15:16:22 -0700 Subject: [PATCH 08/41] Add KeyVault and appinsights --- templates/todo/api/java/Dockerfile | 22 +++++++++++++++++++ templates/todo/api/java/README.md | 18 +++++++++++++-- templates/todo/api/java/pom.xml | 22 ++++++++++++++----- .../simpletodo/SimpleTodoApplication.java | 4 ++++ .../src/main/resources/application.properties | 10 +++++++-- .../main/resources/applicationinsights.json | 6 +++++ .../todo/projects/java-mongo-aca/README.md | 2 +- 7 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 templates/todo/api/java/Dockerfile create mode 100644 templates/todo/api/java/src/main/resources/applicationinsights.json diff --git a/templates/todo/api/java/Dockerfile b/templates/todo/api/java/Dockerfile new file mode 100644 index 00000000000..b3b10a29592 --- /dev/null +++ b/templates/todo/api/java/Dockerfile @@ -0,0 +1,22 @@ +FROM mcr.microsoft.com/openjdk/jdk:17-mariner AS build + +WORKDIR /workspace/app + +COPY mvnw . +COPY .mvn .mvn +COPY openapi.yaml openapi.yaml +COPY pom.xml . +COPY src src +RUN touch .env + +RUN ./mvnw package -DskipTests +RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar) + +FROM mcr.microsoft.com/openjdk/jdk:17-mariner + +ARG DEPENDENCY=/workspace/app/target/dependency +COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib +COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF +COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app + +ENTRYPOINT ["java","-cp","app:app/lib/*","com.microsoft.azure.simpletodo.SimpleTodoApplication"] \ No newline at end of file diff --git a/templates/todo/api/java/README.md b/templates/todo/api/java/README.md index 57a77b30752..ab879347942 100644 --- a/templates/todo/api/java/README.md +++ b/templates/todo/api/java/README.md @@ -8,9 +8,23 @@ ### Local Environment -Create a `.env` with the following configuration: +Create an `.env` file. +Set the property values by either providing a KeyVault endpoint, or to provide the secrets directly. -- `AZURE_COSMOS_CONNECTION_STRING` - Cosmos DB connection string (Mongo DB also supported) +#### Option 1: Use KeyVault to provide secrets + +Set `AZURE_KEY_VAULT_ENDPOINT`. With this set, other secret environment properties such as `AZURE_COSMOS_CONNECTION_STRING` are loaded from KeyVault. + +#### Option 2: Provide secrets directly + +Set `AZURE_COSMOS_CONNECTION_STRING`, the Cosmos DB connection string (Mongo DB also supported) + +#### Local ApplicationInsights telemetry + +To configure Application Insights locally, either + +- Set an environment variable `APPLICATIONINSIGHTS_CONNECTION_STRING` +- Update the `connectionString` defined in `applicationinsights.json` ### Build & Compile diff --git a/templates/todo/api/java/pom.xml b/templates/todo/api/java/pom.xml index cfb71851404..89dd778630b 100644 --- a/templates/todo/api/java/pom.xml +++ b/templates/todo/api/java/pom.xml @@ -1,10 +1,12 @@ - + 4.0.0 org.springframework.boot spring-boot-starter-parent 2.7.2 - + + com.microsoft.azure.simpletodo simple-todo @@ -12,8 +14,7 @@ SimpleTodo Simple Todo application - tmp-judubois-1111 - 18 + 17 ${java.version} ${java.version} 1.6.4 @@ -58,7 +59,7 @@ jackson-databind-nullable 0.2.2 - + jakarta.validation jakarta.validation-api @@ -67,6 +68,17 @@ com.fasterxml.jackson.core jackson-databind + + + com.azure.spring + spring-cloud-azure-starter-keyvault-secrets + 4.3.0 + + + com.microsoft.azure + applicationinsights-runtime-attach + 3.3.1 + src/main/java diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java index d723329cd3f..18f6d0bcfd1 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/SimpleTodoApplication.java @@ -3,10 +3,14 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import com.microsoft.applicationinsights.attach.ApplicationInsights; + @SpringBootApplication public class SimpleTodoApplication { public static void main(String[] args) { + ApplicationInsights.attach(); + new SpringApplication(SimpleTodoApplication.class).run(args); } } diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index a7ef54310a2..6382e9b5b98 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -1,8 +1,14 @@ server.port=3100 +spring.profiles.active=@spring.profiles.active@ + spring.jackson.date-format=com.microsoft.azure.simpletodo.configuration.RFC3339DateFormat spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false -# The AZURE_COSMOS_CONNECTION_STRING key should be configured in a .env file at the root of the project -spring.data.mongodb.uri=@AZURE_COSMOS_CONNECTION_STRING@ +# Import KeyVault secrets as properties +spring.cloud.azure.keyvault.secret.property-sources[0].enabled=true +spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAULT_ENDPOINT:@AZURE_KEY_VAULT_ENDPOINT@} + +# Resolve connection string placholder from KeyVault. Fallback to project property if undefined. +spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING@} spring.data.mongodb.database=todo diff --git a/templates/todo/api/java/src/main/resources/applicationinsights.json b/templates/todo/api/java/src/main/resources/applicationinsights.json new file mode 100644 index 00000000000..e4b08093903 --- /dev/null +++ b/templates/todo/api/java/src/main/resources/applicationinsights.json @@ -0,0 +1,6 @@ +{ + "connectionString": "", + "role": { + "name": "API" + } +} diff --git a/templates/todo/projects/java-mongo-aca/README.md b/templates/todo/projects/java-mongo-aca/README.md index 660b8e16325..ba69cf45ae9 100644 --- a/templates/todo/projects/java-mongo-aca/README.md +++ b/templates/todo/projects/java-mongo-aca/README.md @@ -24,7 +24,7 @@ The following prerequisites are required to use this application. Please ensure curl -fsSL https://aka.ms/install-azd.sh | bash ``` - [Azure CLI (2.38.0+)](https://docs.microsoft.com/cli/azure/install-azure-cli) -- [Java 18 or later](https://jdk.java.net/) - for API backend +- [Java 17 or later](https://jdk.java.net/) - for API backend - [Node.js with npm (16.13.1+)](https://nodejs.org/) - for the Web frontend - [Docker](https://docs.docker.com/get-docker/) - [Git (2.36.1+)](https://git-scm.com/) From 81e019d7bf257a3a1234f3877a2e8553bf6485f7 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Tue, 13 Sep 2022 16:38:10 -0700 Subject: [PATCH 09/41] remove @ --- .../todo/api/java/src/main/resources/application.properties | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index 6382e9b5b98..af84a8bf7db 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -1,13 +1,11 @@ server.port=3100 -spring.profiles.active=@spring.profiles.active@ - spring.jackson.date-format=com.microsoft.azure.simpletodo.configuration.RFC3339DateFormat spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false # Import KeyVault secrets as properties spring.cloud.azure.keyvault.secret.property-sources[0].enabled=true -spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAULT_ENDPOINT:@AZURE_KEY_VAULT_ENDPOINT@} +spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEYVAULT_ENDPOINT:@AZURE_KEYVAULT_ENDPOINT@} # Resolve connection string placholder from KeyVault. Fallback to project property if undefined. spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING@} From af5fc3164d014f1e86a83d002ef10da7be79d23e Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Wed, 14 Sep 2022 10:57:49 -0700 Subject: [PATCH 10/41] Template fixes --- templates/todo/api/java/.gitignore | 2 ++ templates/todo/api/java/Dockerfile | 3 ++- .../todo/api/java/src/main/resources/application.properties | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/templates/todo/api/java/.gitignore b/templates/todo/api/java/.gitignore index 549e00a2a96..d26f4fbbc7e 100644 --- a/templates/todo/api/java/.gitignore +++ b/templates/todo/api/java/.gitignore @@ -31,3 +31,5 @@ build/ ### VS Code ### .vscode/ + +applicationinsights.log \ No newline at end of file diff --git a/templates/todo/api/java/Dockerfile b/templates/todo/api/java/Dockerfile index b3b10a29592..5e46c215531 100644 --- a/templates/todo/api/java/Dockerfile +++ b/templates/todo/api/java/Dockerfile @@ -1,6 +1,7 @@ FROM mcr.microsoft.com/openjdk/jdk:17-mariner AS build WORKDIR /workspace/app +EXPOSE 3100 COPY mvnw . COPY .mvn .mvn @@ -19,4 +20,4 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app -ENTRYPOINT ["java","-cp","app:app/lib/*","com.microsoft.azure.simpletodo.SimpleTodoApplication"] \ No newline at end of file +ENTRYPOINT ["java","-noverify", "-XX:MaxRAMPercentage=70", "-XX:+UseParallelGC", "-XX:ActiveProcessorCount=2", "-cp","app:app/lib/*","com.microsoft.azure.simpletodo.SimpleTodoApplication"] \ No newline at end of file diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index af84a8bf7db..5f66cf52e33 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -5,8 +5,8 @@ spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false # Import KeyVault secrets as properties spring.cloud.azure.keyvault.secret.property-sources[0].enabled=true -spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEYVAULT_ENDPOINT:@AZURE_KEYVAULT_ENDPOINT@} +spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAULT_ENDPOINT:@AZURE_KEY_VAULT_ENDPOINT} # Resolve connection string placholder from KeyVault. Fallback to project property if undefined. -spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING@} +spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING} spring.data.mongodb.database=todo From cb2df1876ff3b4962dc355be26bf3bd15bff6fb5 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 15 Sep 2022 09:13:32 -0700 Subject: [PATCH 11/41] Bump up API container to 1 core, 2 GB minimum --- templates/todo/api/java/.gitattributes | 2 ++ templates/todo/common/infra/aca/bicep/api.bicep | 10 ++++++++++ templates/todo/common/infra/aca/bicep/main.bicep | 8 ++++++++ templates/todo/common/infra/aca/bicep/resources.bicep | 8 ++++++++ 4 files changed, 28 insertions(+) create mode 100644 templates/todo/api/java/.gitattributes diff --git a/templates/todo/api/java/.gitattributes b/templates/todo/api/java/.gitattributes new file mode 100644 index 00000000000..d3f33ee30c4 --- /dev/null +++ b/templates/todo/api/java/.gitattributes @@ -0,0 +1,2 @@ +*.sh text eol=lf +mvnw text eol=lf diff --git a/templates/todo/common/infra/aca/bicep/api.bicep b/templates/todo/common/infra/aca/bicep/api.bicep index 3e43d99255d..73b97c71b2c 100644 --- a/templates/todo/common/infra/aca/bicep/api.bicep +++ b/templates/todo/common/infra/aca/bicep/api.bicep @@ -9,6 +9,12 @@ param location string param imageName string +@description('CPU cores allocated to a single container instance, e.g. 0.5') +param containerCpuCoreCount string + +@description('Memory allocated to a single container instance, e.g. 1Gi') +param containerMemory string + var resourceToken = toLower(uniqueString(subscription().id, name, location)) var tags = { 'azd-env-name': name } var abbrs = loadJsonContent('../../../../../common/infra/bicep/abbreviations.json') @@ -75,6 +81,10 @@ resource api 'Microsoft.App/containerApps@2022-03-01' = { value: keyVault.properties.vaultUri } ] + resources: { + cpu: json(containerCpuCoreCount) + memory: containerMemory + } } ] } diff --git a/templates/todo/common/infra/aca/bicep/main.bicep b/templates/todo/common/infra/aca/bicep/main.bicep index f6b6462d69d..9f34f940a3d 100644 --- a/templates/todo/common/infra/aca/bicep/main.bicep +++ b/templates/todo/common/infra/aca/bicep/main.bicep @@ -18,6 +18,12 @@ param apiImageName string = '' @description('The image name for the web service') param webImageName string = '' +@description('CPU cores allocated to a single container instance for the API container, e.g. 0.5') +param apiContainerCpuCoreCount string = '1' + +@description('Memory allocated to a single container instance for the API container, e.g. 1Gi') +param apiContainerMemory string = '2.0Gi' + var resourceToken = toLower(uniqueString(subscription().id, name, location)) var tags = { 'azd-env-name': name } var abbrs = loadJsonContent('../../../../../common/infra/bicep/abbreviations.json') @@ -38,6 +44,8 @@ module resources 'resources.bicep' = { resourceToken: resourceToken apiImageName: apiImageName webImageName: webImageName + apiContainerCpuCoreCount: apiContainerCpuCoreCount + apiContainerMemory: apiContainerMemory tags: tags } } diff --git a/templates/todo/common/infra/aca/bicep/resources.bicep b/templates/todo/common/infra/aca/bicep/resources.bicep index 3aa119ac80e..0177c86cdf9 100644 --- a/templates/todo/common/infra/aca/bicep/resources.bicep +++ b/templates/todo/common/infra/aca/bicep/resources.bicep @@ -6,6 +6,12 @@ param tags object param apiImageName string = '' param webImageName string = '' +@description('CPU cores allocated to a single container instance for the API container, e.g. 0.5') +param apiContainerCpuCoreCount string + +@description('Memory allocated to a single container instance for the API container, e.g. 1Gi') +param apiContainerMemory string + var abbrs = loadJsonContent('../../../../../common/infra/bicep/abbreviations.json') resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-03-01' = { @@ -99,6 +105,8 @@ module api 'api.bicep' = { name: name location: location imageName: apiImageName != '' ? apiImageName : 'nginx:latest' + containerCpuCoreCount: apiContainerCpuCoreCount + containerMemory: apiContainerMemory } dependsOn: [ containerAppsEnvironment From c400a80bb1c399d34cab370b3a4c944c71786f9c Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 15 Sep 2022 11:19:32 -0700 Subject: [PATCH 12/41] Fix local development --- templates/todo/api/java/pom.xml | 3 - .../src/main/resources/application.properties | 4 +- .../java-mongo-aca/.vscode/launch.json | 35 ++++++++ .../java-mongo-aca/.vscode/tasks.json | 90 +++++++++++++++++++ 4 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 templates/todo/projects/java-mongo-aca/.vscode/launch.json create mode 100644 templates/todo/projects/java-mongo-aca/.vscode/tasks.json diff --git a/templates/todo/api/java/pom.xml b/templates/todo/api/java/pom.xml index 89dd778630b..8cb8eaa7afd 100644 --- a/templates/todo/api/java/pom.xml +++ b/templates/todo/api/java/pom.xml @@ -82,9 +82,6 @@ src/main/java - - .env - src/main/resources diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index 5f66cf52e33..587f2dc346c 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -5,8 +5,8 @@ spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false # Import KeyVault secrets as properties spring.cloud.azure.keyvault.secret.property-sources[0].enabled=true -spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAULT_ENDPOINT:@AZURE_KEY_VAULT_ENDPOINT} +spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAULT_ENDPOINT:#{null}} # Resolve connection string placholder from KeyVault. Fallback to project property if undefined. -spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING} +spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING:#{null}} spring.data.mongodb.database=todo diff --git a/templates/todo/projects/java-mongo-aca/.vscode/launch.json b/templates/todo/projects/java-mongo-aca/.vscode/launch.json new file mode 100644 index 00000000000..8140ef611fc --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Web", + "request": "launch", + "type": "msedge", + "webRoot": "${workspaceFolder}/src/web/src", + "url": "http://localhost:3000", + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + }, + }, + + { + "name": "Debug API", + "type": "java", + "request": "launch", + "preLaunchTask": "Build API", + "mainClass": "com.microsoft.azure.simpletodo.SimpleTodoApplication", + "args": [], + "cwd": "${workspaceFolder}/src/api", + "env": {}, + "envFile": "${input:dotEnvFilePath}" + } + ], + + "inputs": [ + { + "id": "dotEnvFilePath", + "type": "command", + "command": "azure-dev.commands.getDotEnvFilePath" + } + ] +} diff --git a/templates/todo/projects/java-mongo-aca/.vscode/tasks.json b/templates/todo/projects/java-mongo-aca/.vscode/tasks.json new file mode 100644 index 00000000000..166745cef91 --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/.vscode/tasks.json @@ -0,0 +1,90 @@ +{ + "version": "2.0.0", + "tasks": [ + + { + "label": "Start API", + "type": "dotenv", + "targetTasks": "API mvn spring-boot:run", + "file": "${input:dotEnvFilePath}" + }, + { + "label": "API mvn spring-boot:run", + "detail": "Helper task--use 'Start API' task to ensure environment is set up correctly", + "type": "shell", + "command": "./mvnw spring-boot:run", + "options": { + "cwd": "${workspaceFolder}/src/api/" + }, + "presentation": { + "panel": "dedicated", + }, + "problemMatcher": [] + }, + { + "label": "Build API", + "command": "./mvnw", + "type": "process", + "options": { + "cwd": "${workspaceFolder}/src/api/" + }, + "args": [ + "package", + "-DskipTests" + ], + "problemMatcher": [] + }, + { + "label": "Start Web", + "type": "dotenv", + "targetTasks": [ + "Restore Web", + "Web npm start" + ], + "file": "${input:dotEnvFilePath}" + }, + { + "label": "Restore Web", + "type": "shell", + "command": "azd restore --service web", + "presentation": { + "reveal": "silent" + }, + "problemMatcher": [] + }, + { + "label": "Web npm start", + "detail": "Helper task--use 'Start Web' task to ensure environment is set up correctly", + "type": "shell", + "command": "npm run start", + "options": { + "cwd": "${workspaceFolder}/src/web/", + "env": { + "REACT_APP_API_BASE_URL": "http://localhost:3100", + "BROWSER": "none" + } + }, + "presentation": { + "panel": "dedicated", + }, + "problemMatcher": [] + }, + + { + "label": "Start API and Web", + "dependsOn":[ + "Start API", + "Start Web" + ], + "problemMatcher": [] + } + ], + + "inputs": [ + { + "id": "dotEnvFilePath", + "type": "command", + "command": "azure-dev.commands.getDotEnvFilePath" + } + ] +} From 99a15689c4c09f3be1177bb1f89f8115c4cd0830 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 15 Sep 2022 11:19:45 -0700 Subject: [PATCH 13/41] Just mvnw --- templates/todo/api/java/.gitattributes | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/todo/api/java/.gitattributes b/templates/todo/api/java/.gitattributes index d3f33ee30c4..149df3f4afa 100644 --- a/templates/todo/api/java/.gitattributes +++ b/templates/todo/api/java/.gitattributes @@ -1,2 +1 @@ -*.sh text eol=lf mvnw text eol=lf From 849fdd523e4a7843770753302c5e6045e3cc217c Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 15 Sep 2022 12:50:52 -0700 Subject: [PATCH 14/41] Add .devcontainer --- .../devcontainer.json/java/devcontainer.json | 32 +++++++++++++++++++ .../todo/projects/java-mongo-aca/repo.yaml | 11 +++---- 2 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 templates/common/.devcontainer/devcontainer.json/java/devcontainer.json diff --git a/templates/common/.devcontainer/devcontainer.json/java/devcontainer.json b/templates/common/.devcontainer/devcontainer.json/java/devcontainer.json new file mode 100644 index 00000000000..c2b065aceac --- /dev/null +++ b/templates/common/.devcontainer/devcontainer.json/java/devcontainer.json @@ -0,0 +1,32 @@ +{ + "name": "Azure Developer CLI", + "build": { + "dockerfile": "Dockerfile", + "args": { + "VARIANT": "bullseye" + } + }, + "features": { + "github-cli": "2", + "azure-cli": "2.38", + "docker-from-docker": "20.10", + "java": "17.0", + "node": { + "version": "16", + "nodeGypDependencies": false + } + }, + "extensions": [ + "ms-azuretools.azure-dev", + "ms-azuretools.vscode-bicep", + "ms-azuretools.vscode-docker", + "ms-vscode.vscode-node-azure-pack", + "vscjava.vscode-java-pack" + ], + "forwardPorts": [ + 3000, + 3100 + ], + "postCreateCommand": "", + "remoteUser": "vscode" +} \ No newline at end of file diff --git a/templates/todo/projects/java-mongo-aca/repo.yaml b/templates/todo/projects/java-mongo-aca/repo.yaml index b79f94c2646..cbaddc3d9f5 100644 --- a/templates/todo/projects/java-mongo-aca/repo.yaml +++ b/templates/todo/projects/java-mongo-aca/repo.yaml @@ -56,14 +56,13 @@ repo: - from: ../../../common/infra/bicep to: ./infra - # .devcontainer common (devcontainer.json) - # - from: ../../../common/.devcontainer/devcontainer.json/nodejs - # to: ./.devcontainer + - from: ../../../common/.devcontainer/devcontainer.json/java + to: ./.devcontainer - # # .devcontainer common (Dockerfile) - # - from: ../../../common/.devcontainer/Dockerfile/base - # to: ./.devcontainer + # .devcontainer common (Dockerfile) + - from: ../../../common/.devcontainer/Dockerfile/base + to: ./.devcontainer # Assets common - from: ../../common/assets From 346c83457660f1bd55c9d3c04e2635a509e50e99 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 15 Sep 2022 12:51:01 -0700 Subject: [PATCH 15/41] Fix appinsights role name --- templates/todo/api/java/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/templates/todo/api/java/pom.xml b/templates/todo/api/java/pom.xml index 8cb8eaa7afd..ba8c3f0d620 100644 --- a/templates/todo/api/java/pom.xml +++ b/templates/todo/api/java/pom.xml @@ -85,9 +85,6 @@ src/main/resources - - application.properties - true From ca8492df043231c06e3d008dea0af3c63686f565 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 15 Sep 2022 15:13:45 -0700 Subject: [PATCH 16/41] openapi support --- .../todo/api/java/.openapi-generator/FILES | 5 + .../todo/api/java/.openapi-generator/VERSION | 1 + .../openapi.yaml-default.sha256 | 1 + templates/todo/api/java/pom.xml | 268 +++++------ .../azure/simpletodo/api/ListsApi.java | 396 ++++++++-------- .../azure/simpletodo/model/TodoItem.java | 434 +++++++++--------- .../azure/simpletodo/model/TodoList.java | 224 ++++----- .../azure/simpletodo/model/TodoState.java | 77 ++-- .../src/main/resources/application.properties | 2 + .../java-mongo-aca/.vscode/tasks.json | 2 +- .../todo/projects/java-mongo-aca/repo.yaml | 5 + 11 files changed, 739 insertions(+), 676 deletions(-) create mode 100644 templates/todo/api/java/.openapi-generator/FILES create mode 100644 templates/todo/api/java/.openapi-generator/VERSION create mode 100644 templates/todo/api/java/.openapi-generator/openapi.yaml-default.sha256 diff --git a/templates/todo/api/java/.openapi-generator/FILES b/templates/todo/api/java/.openapi-generator/FILES new file mode 100644 index 00000000000..726c90a1f19 --- /dev/null +++ b/templates/todo/api/java/.openapi-generator/FILES @@ -0,0 +1,5 @@ +src/main/java/com/microsoft/azure/simpletodo/api/ApiUtil.java +src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java +src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java +src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java +src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java diff --git a/templates/todo/api/java/.openapi-generator/VERSION b/templates/todo/api/java/.openapi-generator/VERSION new file mode 100644 index 00000000000..6d54bbd7751 --- /dev/null +++ b/templates/todo/api/java/.openapi-generator/VERSION @@ -0,0 +1 @@ +6.0.1 \ No newline at end of file diff --git a/templates/todo/api/java/.openapi-generator/openapi.yaml-default.sha256 b/templates/todo/api/java/.openapi-generator/openapi.yaml-default.sha256 new file mode 100644 index 00000000000..4bf5f74fc3c --- /dev/null +++ b/templates/todo/api/java/.openapi-generator/openapi.yaml-default.sha256 @@ -0,0 +1 @@ +1e0347e24b739d303f3af0493d1e730e4ac47a27fdac1e8a151defcc745496f0 \ No newline at end of file diff --git a/templates/todo/api/java/pom.xml b/templates/todo/api/java/pom.xml index ba8c3f0d620..1bd850c025c 100644 --- a/templates/todo/api/java/pom.xml +++ b/templates/todo/api/java/pom.xml @@ -1,136 +1,146 @@ - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.7.2 - - - - com.microsoft.azure.simpletodo - simple-todo - 0.0.1-SNAPSHOT - SimpleTodo - Simple Todo application - - 17 - ${java.version} - ${java.version} - 1.6.4 - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.2 + + + + com.microsoft.azure.simpletodo + simple-todo + 0.0.1-SNAPSHOT + SimpleTodo + Simple Todo application + + 17 + ${java.version} + ${java.version} + 1.6.4 + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.data - spring-data-commons - - - org.springframework.boot - spring-boot-starter-data-mongodb - - - org.springframework.boot - spring-boot-devtools - runtime - true - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springdoc - springdoc-openapi-ui - ${springdoc.version} - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.openapitools - jackson-databind-nullable - 0.2.2 - - - - jakarta.validation - jakarta.validation-api - - - com.fasterxml.jackson.core - jackson-databind - - - - com.azure.spring - spring-cloud-azure-starter-keyvault-secrets - 4.3.0 - - - com.microsoft.azure - applicationinsights-runtime-attach - 3.3.1 - - - - src/main/java - - - src/main/resources - true - - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.data + spring-data-commons + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.openapitools + jackson-databind-nullable + 0.2.2 + + + + jakarta.validation + jakarta.validation-api + + + com.fasterxml.jackson.core + jackson-databind + + + + com.azure.spring + spring-cloud-azure-starter-keyvault-secrets + 4.3.0 + + + com.microsoft.azure + applicationinsights-runtime-attach + 3.3.1 + + + + src/main/java + + + src/main/resources + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + + azure/azure-dev-todo-java + + + + + + repackage + + + + + + + + + + openapigen + - - org.springframework.boot - spring-boot-maven-plugin - - - azure/azure-dev-todo-java - - - - - - repackage - - - - - - com.microsoft.azure - azure-webapp-maven-plugin - 2.3.0 + + org.openapitools + openapi-generator-maven-plugin + 6.0.1 + + + + generate + - ${basename}rg - ${basename}api - B1 - - Linux - Java SE - Java 11 - - - - - jar - ${project.basedir}/target - - *.jar - - - - + ${project.basedir}/../common/openapi.yaml + spring + ${project.basedir} + com.microsoft.azure.simpletodo.api + com.microsoft.azure.simpletodo.model + ApiUtil.java + + src/main/java/ + false + true + true + - + + + - + + + diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java index 4027c9a4c17..dcc1795e412 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/api/ListsApi.java @@ -1,18 +1,22 @@ /** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (5.3.1). + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (6.0.1). * https://openapi-generator.tech * Do not edit the class manually. */ package com.microsoft.azure.simpletodo.api; +import java.math.BigDecimal; +import java.util.List; import com.microsoft.azure.simpletodo.model.TodoItem; import com.microsoft.azure.simpletodo.model.TodoList; import com.microsoft.azure.simpletodo.model.TodoState; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -20,14 +24,16 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.multipart.MultipartFile; -import javax.annotation.Generated; import javax.validation.Valid; -import java.math.BigDecimal; +import javax.validation.constraints.*; import java.util.List; +import java.util.Map; import java.util.Optional; +import javax.annotation.Generated; -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:06:05.934415+01:00[Europe/Berlin]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") @Validated @Tag(name = "lists", description = "the lists API") public interface ListsApi { @@ -39,32 +45,34 @@ default Optional getRequest() { /** * POST /lists/{listId}/items : Creates a new Todo item within a list * - * @param listId The Todo list unique identifier (required) + * @param listId The Todo list unique identifier (required) * @param todoItem The Todo Item (optional) * @return A Todo item result (status code 201) - * or Todo list not found (status code 404) + * or Todo list not found (status code 404) */ @Operation( - operationId = "createItem", - summary = "Creates a new Todo item within a list", - tags = {"Items"}, - responses = { - @ApiResponse(responseCode = "201", description = "A Todo item result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), - @ApiResponse(responseCode = "404", description = "Todo list not found") - } + operationId = "createItem", + summary = "Creates a new Todo item within a list", + tags = { "Items" }, + responses = { + @ApiResponse(responseCode = "201", description = "A Todo item result", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class)) + }), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } ) @RequestMapping( - method = RequestMethod.POST, - value = "/lists/{listId}/items", - produces = {"application/json"}, - consumes = {"application/json"} + method = RequestMethod.POST, + value = "/lists/{listId}/items", + produces = { "application/json" }, + consumes = { "application/json" } ) default ResponseEntity createItem( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "TodoItem", description = "The Todo Item", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoItem todoItem + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "TodoItem", description = "The Todo Item") @Valid @RequestBody(required = false) TodoItem todoItem ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -82,28 +90,30 @@ default ResponseEntity createItem( * * @param todoList The Todo List (optional) * @return A Todo list result (status code 201) - * or Invalid request schema (status code 400) + * or Invalid request schema (status code 400) */ @Operation( - operationId = "createList", - summary = "Creates a new Todo list", - tags = {"Lists"}, - responses = { - @ApiResponse(responseCode = "201", description = "A Todo list result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))), - @ApiResponse(responseCode = "400", description = "Invalid request schema") - } + operationId = "createList", + summary = "Creates a new Todo list", + tags = { "Lists" }, + responses = { + @ApiResponse(responseCode = "201", description = "A Todo list result", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class)) + }), + @ApiResponse(responseCode = "400", description = "Invalid request schema") + } ) @RequestMapping( - method = RequestMethod.POST, - value = "/lists", - produces = {"application/json"}, - consumes = {"application/json"} + method = RequestMethod.POST, + value = "/lists", + produces = { "application/json" }, + consumes = { "application/json" } ) default ResponseEntity createList( - @Parameter(name = "TodoList", description = "The Todo List", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoList todoList + @Parameter(name = "TodoList", description = "The Todo List") @Valid @RequestBody(required = false) TodoList todoList ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -122,24 +132,24 @@ default ResponseEntity createList( * @param listId The Todo list unique identifier (required) * @param itemId The Todo list unique identifier (required) * @return Todo item deleted successfully (status code 204) - * or Todo list or item not found (status code 404) + * or Todo list or item not found (status code 404) */ @Operation( - operationId = "deleteItemById", - summary = "Deletes a Todo item by unique identifier", - tags = {"Items"}, - responses = { - @ApiResponse(responseCode = "204", description = "Todo item deleted successfully"), - @ApiResponse(responseCode = "404", description = "Todo list or item not found") - } + operationId = "deleteItemById", + summary = "Deletes a Todo item by unique identifier", + tags = { "Items" }, + responses = { + @ApiResponse(responseCode = "204", description = "Todo item deleted successfully"), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } ) @RequestMapping( - method = RequestMethod.DELETE, - value = "/lists/{listId}/items/{itemId}" + method = RequestMethod.DELETE, + value = "/lists/{listId}/items/{itemId}" ) default ResponseEntity deleteItemById( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("itemId") String itemId + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true) @PathVariable("itemId") String itemId ) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); @@ -151,23 +161,23 @@ default ResponseEntity deleteItemById( * * @param listId The Todo list unique identifier (required) * @return Todo list deleted successfully (status code 204) - * or Todo list not found (status code 404) + * or Todo list not found (status code 404) */ @Operation( - operationId = "deleteListById", - summary = "Deletes a Todo list by unique identifier", - tags = {"Lists"}, - responses = { - @ApiResponse(responseCode = "204", description = "Todo list deleted successfully"), - @ApiResponse(responseCode = "404", description = "Todo list not found") - } + operationId = "deleteListById", + summary = "Deletes a Todo list by unique identifier", + tags = { "Lists" }, + responses = { + @ApiResponse(responseCode = "204", description = "Todo list deleted successfully"), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } ) @RequestMapping( - method = RequestMethod.DELETE, - value = "/lists/{listId}" + method = RequestMethod.DELETE, + value = "/lists/{listId}" ) default ResponseEntity deleteListById( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId ) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); @@ -180,28 +190,30 @@ default ResponseEntity deleteListById( * @param listId The Todo list unique identifier (required) * @param itemId The Todo list unique identifier (required) * @return A Todo item result (status code 200) - * or Todo list or item not found (status code 404) + * or Todo list or item not found (status code 404) */ @Operation( - operationId = "getItemById", - summary = "Gets a Todo item by unique identifier", - tags = {"Items"}, - responses = { - @ApiResponse(responseCode = "200", description = "A Todo item result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), - @ApiResponse(responseCode = "404", description = "Todo list or item not found") - } + operationId = "getItemById", + summary = "Gets a Todo item by unique identifier", + tags = { "Items" }, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo item result", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class)) + }), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } ) @RequestMapping( - method = RequestMethod.GET, - value = "/lists/{listId}/items/{itemId}", - produces = {"application/json"} + method = RequestMethod.GET, + value = "/lists/{listId}/items/{itemId}", + produces = { "application/json" } ) default ResponseEntity getItemById( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("itemId") String itemId + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true) @PathVariable("itemId") String itemId ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -218,32 +230,34 @@ default ResponseEntity getItemById( * GET /lists/{listId}/items : Gets Todo items within the specified list * * @param listId The Todo list unique identifier (required) - * @param top The max number of items to returns in a result (optional) - * @param skip The number of items to skip within the results (optional) + * @param top The max number of items to returns in a result (optional) + * @param skip The number of items to skip within the results (optional) * @return An array of Todo items (status code 200) - * or Todo list not found (status code 404) + * or Todo list not found (status code 404) */ @Operation( - operationId = "getItemsByListId", - summary = "Gets Todo items within the specified list", - tags = {"Items"}, - responses = { - @ApiResponse(responseCode = "200", description = "An array of Todo items", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), - @ApiResponse(responseCode = "404", description = "Todo list not found") - } + operationId = "getItemsByListId", + summary = "Gets Todo items within the specified list", + tags = { "Items" }, + responses = { + @ApiResponse(responseCode = "200", description = "An array of Todo items", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class)) + }), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } ) @RequestMapping( - method = RequestMethod.GET, - value = "/lists/{listId}/items", - produces = {"application/json"} + method = RequestMethod.GET, + value = "/lists/{listId}/items", + produces = { "application/json" } ) default ResponseEntity> getItemsByListId( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "top", description = "The max number of items to returns in a result", schema = @Schema(description = "")) @Valid @RequestParam(value = "top", required = false) BigDecimal top, - @Parameter(name = "skip", description = "The number of items to skip within the results", schema = @Schema(description = "")) @Valid @RequestParam(value = "skip", required = false) BigDecimal skip + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "top", description = "The max number of items to returns in a result") @Valid @RequestParam(value = "top", required = false) BigDecimal top, + @Parameter(name = "skip", description = "The number of items to skip within the results") @Valid @RequestParam(value = "skip", required = false) BigDecimal skip ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -260,34 +274,36 @@ default ResponseEntity> getItemsByListId( * GET /lists/{listId}/items/state/{state} : Gets a list of Todo items of a specific state * * @param listId The Todo list unique identifier (required) - * @param state The Todo item state (required) - * @param top The max number of items to returns in a result (optional) - * @param skip The number of items to skip within the results (optional) + * @param state The Todo item state (required) + * @param top The max number of items to returns in a result (optional) + * @param skip The number of items to skip within the results (optional) * @return An array of Todo items (status code 200) - * or Todo list or item not found (status code 404) + * or Todo list or item not found (status code 404) */ @Operation( - operationId = "getItemsByListIdAndState", - summary = "Gets a list of Todo items of a specific state", - tags = {"Items"}, - responses = { - @ApiResponse(responseCode = "200", description = "An array of Todo items", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), - @ApiResponse(responseCode = "404", description = "Todo list or item not found") - } + operationId = "getItemsByListIdAndState", + summary = "Gets a list of Todo items of a specific state", + tags = { "Items" }, + responses = { + @ApiResponse(responseCode = "200", description = "An array of Todo items", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class)) + }), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } ) @RequestMapping( - method = RequestMethod.GET, - value = "/lists/{listId}/items/state/{state}", - produces = {"application/json"} + method = RequestMethod.GET, + value = "/lists/{listId}/items/state/{state}", + produces = { "application/json" } ) default ResponseEntity> getItemsByListIdAndState( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "state", description = "The Todo item state", required = true, schema = @Schema(description = "", allowableValues = {"todo", "inprogress", "done"})) @PathVariable("state") TodoState state, - @Parameter(name = "top", description = "The max number of items to returns in a result", schema = @Schema(description = "")) @Valid @RequestParam(value = "top", required = false) BigDecimal top, - @Parameter(name = "skip", description = "The number of items to skip within the results", schema = @Schema(description = "")) @Valid @RequestParam(value = "skip", required = false) BigDecimal skip + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "state", description = "The Todo item state", required = true) @PathVariable("state") TodoState state, + @Parameter(name = "top", description = "The max number of items to returns in a result") @Valid @RequestParam(value = "top", required = false) BigDecimal top, + @Parameter(name = "skip", description = "The number of items to skip within the results") @Valid @RequestParam(value = "skip", required = false) BigDecimal skip ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -305,27 +321,29 @@ default ResponseEntity> getItemsByListIdAndState( * * @param listId The Todo list unique identifier (required) * @return A Todo list result (status code 200) - * or Todo list not found (status code 404) + * or Todo list not found (status code 404) */ @Operation( - operationId = "getListById", - summary = "Gets a Todo list by unique identifier", - tags = {"Lists"}, - responses = { - @ApiResponse(responseCode = "200", description = "A Todo list result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))), - @ApiResponse(responseCode = "404", description = "Todo list not found") - } + operationId = "getListById", + summary = "Gets a Todo list by unique identifier", + tags = { "Lists" }, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo list result", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class)) + }), + @ApiResponse(responseCode = "404", description = "Todo list not found") + } ) @RequestMapping( - method = RequestMethod.GET, - value = "/lists/{listId}", - produces = {"application/json"} + method = RequestMethod.GET, + value = "/lists/{listId}", + produces = { "application/json" } ) default ResponseEntity getListById( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -341,29 +359,31 @@ default ResponseEntity getListById( /** * GET /lists : Gets an array of Todo lists * - * @param top The max number of items to returns in a result (optional) + * @param top The max number of items to returns in a result (optional) * @param skip The number of items to skip within the results (optional) * @return An array of Todo lists (status code 200) */ @Operation( - operationId = "getLists", - summary = "Gets an array of Todo lists", - tags = {"Lists"}, - responses = { - @ApiResponse(responseCode = "200", description = "An array of Todo lists", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))) - } + operationId = "getLists", + summary = "Gets an array of Todo lists", + tags = { "Lists" }, + responses = { + @ApiResponse(responseCode = "200", description = "An array of Todo lists", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class)) + }) + } ) @RequestMapping( - method = RequestMethod.GET, - value = "/lists", - produces = {"application/json"} + method = RequestMethod.GET, + value = "/lists", + produces = { "application/json" } ) default ResponseEntity> getLists( - @Parameter(name = "top", description = "The max number of items to returns in a result", schema = @Schema(description = "")) @Valid @RequestParam(value = "top", required = false) BigDecimal top, - @Parameter(name = "skip", description = "The number of items to skip within the results", schema = @Schema(description = "")) @Valid @RequestParam(value = "skip", required = false) BigDecimal skip + @Parameter(name = "top", description = "The max number of items to returns in a result") @Valid @RequestParam(value = "top", required = false) BigDecimal top, + @Parameter(name = "skip", description = "The number of items to skip within the results") @Valid @RequestParam(value = "skip", required = false) BigDecimal skip ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -379,36 +399,38 @@ default ResponseEntity> getLists( /** * PUT /lists/{listId}/items/{itemId} : Updates a Todo item by unique identifier * - * @param listId The Todo list unique identifier (required) - * @param itemId The Todo list unique identifier (required) + * @param listId The Todo list unique identifier (required) + * @param itemId The Todo list unique identifier (required) * @param todoItem The Todo Item (optional) * @return A Todo item result (status code 200) - * or Todo item is invalid (status code 400) - * or Todo list or item not found (status code 404) + * or Todo item is invalid (status code 400) + * or Todo list or item not found (status code 404) */ @Operation( - operationId = "updateItemById", - summary = "Updates a Todo item by unique identifier", - tags = {"Items"}, - responses = { - @ApiResponse(responseCode = "200", description = "A Todo item result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class))), - @ApiResponse(responseCode = "400", description = "Todo item is invalid"), - @ApiResponse(responseCode = "404", description = "Todo list or item not found") - } + operationId = "updateItemById", + summary = "Updates a Todo item by unique identifier", + tags = { "Items" }, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo item result", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoItem.class)) + }), + @ApiResponse(responseCode = "400", description = "Todo item is invalid"), + @ApiResponse(responseCode = "404", description = "Todo list or item not found") + } ) @RequestMapping( - method = RequestMethod.PUT, - value = "/lists/{listId}/items/{itemId}", - produces = {"application/json"}, - consumes = {"application/json"} + method = RequestMethod.PUT, + value = "/lists/{listId}/items/{itemId}", + produces = { "application/json" }, + consumes = { "application/json" } ) default ResponseEntity updateItemById( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("itemId") String itemId, - @Parameter(name = "TodoItem", description = "The Todo Item", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoItem todoItem + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "itemId", description = "The Todo list unique identifier", required = true) @PathVariable("itemId") String itemId, + @Parameter(name = "TodoItem", description = "The Todo Item") @Valid @RequestBody(required = false) TodoItem todoItem ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"listId\" : \"listId\", \"dueDate\" : \"2000-01-23T04:56:07.000+00:00\", \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\", \"completedDate\" : \"2000-01-23T04:56:07.000+00:00\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); @@ -424,30 +446,30 @@ default ResponseEntity updateItemById( /** * PUT /lists/{listId}/items/state/{state} : Changes the state of the specified list items * - * @param listId The Todo list unique identifier (required) - * @param state The Todo item state (required) - * @param requestBody (optional) + * @param listId The Todo list unique identifier (required) + * @param state The Todo item state (required) + * @param requestBody (optional) * @return Todo items updated (status code 204) - * or Update request is invalid (status code 400) + * or Update request is invalid (status code 400) */ @Operation( - operationId = "updateItemsStateByListId", - summary = "Changes the state of the specified list items", - tags = {"Items"}, - responses = { - @ApiResponse(responseCode = "204", description = "Todo items updated"), - @ApiResponse(responseCode = "400", description = "Update request is invalid") - } + operationId = "updateItemsStateByListId", + summary = "Changes the state of the specified list items", + tags = { "Items" }, + responses = { + @ApiResponse(responseCode = "204", description = "Todo items updated"), + @ApiResponse(responseCode = "400", description = "Update request is invalid") + } ) @RequestMapping( - method = RequestMethod.PUT, - value = "/lists/{listId}/items/state/{state}", - consumes = {"application/json"} + method = RequestMethod.PUT, + value = "/lists/{listId}/items/state/{state}", + consumes = { "application/json" } ) default ResponseEntity updateItemsStateByListId( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "state", description = "The Todo item state", required = true, schema = @Schema(description = "", allowableValues = {"todo", "inprogress", "done"})) @PathVariable("state") TodoState state, - @Parameter(name = "request_body", description = "", schema = @Schema(description = "")) @Valid @RequestBody(required = false) List requestBody + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "state", description = "The Todo item state", required = true) @PathVariable("state") TodoState state, + @Parameter(name = "request_body", description = "") @Valid @RequestBody(required = false) List requestBody ) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); @@ -457,32 +479,34 @@ default ResponseEntity updateItemsStateByListId( /** * PUT /lists/{listId} : Updates a Todo list by unique identifier * - * @param listId The Todo list unique identifier (required) + * @param listId The Todo list unique identifier (required) * @param todoList The Todo List (optional) * @return A Todo list result (status code 200) - * or Todo list is invalid (status code 400) + * or Todo list is invalid (status code 400) */ @Operation( - operationId = "updateListById", - summary = "Updates a Todo list by unique identifier", - tags = {"Lists"}, - responses = { - @ApiResponse(responseCode = "200", description = "A Todo list result", content = @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class))), - @ApiResponse(responseCode = "400", description = "Todo list is invalid") - } + operationId = "updateListById", + summary = "Updates a Todo list by unique identifier", + tags = { "Lists" }, + responses = { + @ApiResponse(responseCode = "200", description = "A Todo list result", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = TodoList.class)) + }), + @ApiResponse(responseCode = "400", description = "Todo list is invalid") + } ) @RequestMapping( - method = RequestMethod.PUT, - value = "/lists/{listId}", - produces = {"application/json"}, - consumes = {"application/json"} + method = RequestMethod.PUT, + value = "/lists/{listId}", + produces = { "application/json" }, + consumes = { "application/json" } ) default ResponseEntity updateListById( - @Parameter(name = "listId", description = "The Todo list unique identifier", required = true, schema = @Schema(description = "")) @PathVariable("listId") String listId, - @Parameter(name = "TodoList", description = "The Todo List", schema = @Schema(description = "")) @Valid @RequestBody(required = false) TodoList todoList + @Parameter(name = "listId", description = "The Todo list unique identifier", required = true) @PathVariable("listId") String listId, + @Parameter(name = "TodoList", description = "The Todo List") @Valid @RequestBody(required = false) TodoList todoList ) { getRequest().ifPresent(request -> { - for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { String exampleString = "{ \"name\" : \"name\", \"description\" : \"description\", \"id\" : \"id\" }"; ApiUtil.setExampleResponse(request, "application/json", exampleString); diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java index 3dc964cecc3..92bc02fff1a 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoItem.java @@ -1,233 +1,233 @@ package com.microsoft.azure.simpletodo.model; +import java.net.URI; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.microsoft.azure.simpletodo.model.TodoState; +import java.time.OffsetDateTime; import org.springframework.format.annotation.DateTimeFormat; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.*; import javax.annotation.Generated; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.time.OffsetDateTime; -import java.util.Objects; /** * A task that needs to be completed */ @Schema(name = "TodoItem", description = "A task that needs to be completed") -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:13:58.701016+01:00[Europe/Berlin]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") public class TodoItem { - @JsonProperty("id") - private String id; - - @JsonProperty("listId") - private String listId; - - @JsonProperty("name") - private String name; - - @JsonProperty("description") - private String description; - - @JsonProperty("state") - private TodoState state; - - @JsonProperty("dueDate") - @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) - private OffsetDateTime dueDate; - - @JsonProperty("completedDate") - @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) - private OffsetDateTime completedDate; - - public TodoItem id(String id) { - this.id = id; - return this; - } - - /** - * Get id - * - * @return id - */ - - @Schema(name = "id", required = false) - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public TodoItem listId(String listId) { - this.listId = listId; - return this; - } - - /** - * Get listId - * - * @return listId - */ - @NotNull - @Schema(name = "listId", required = true) - public String getListId() { - return listId; - } - - public void setListId(String listId) { - this.listId = listId; - } - - public TodoItem name(String name) { - this.name = name; - return this; - } - - /** - * Get name - * - * @return name - */ - @NotNull - @Schema(name = "name", required = true) - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public TodoItem description(String description) { - this.description = description; - return this; - } - - /** - * Get description - * - * @return description - */ - @NotNull - @Schema(name = "description", required = true) - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public TodoItem state(TodoState state) { - this.state = state; - return this; - } - - /** - * Get state - * - * @return state - */ - @Valid - @Schema(name = "state", required = false) - public TodoState getState() { - return state; - } - - public void setState(TodoState state) { - this.state = state; - } - - public TodoItem dueDate(OffsetDateTime dueDate) { - this.dueDate = dueDate; - return this; - } - - /** - * Get dueDate - * - * @return dueDate - */ - @Valid - @Schema(name = "dueDate", required = false) - public OffsetDateTime getDueDate() { - return dueDate; - } - - public void setDueDate(OffsetDateTime dueDate) { - this.dueDate = dueDate; - } - - public TodoItem completedDate(OffsetDateTime completedDate) { - this.completedDate = completedDate; - return this; - } - - /** - * Get completedDate - * - * @return completedDate - */ - @Valid - @Schema(name = "completedDate", required = false) - public OffsetDateTime getCompletedDate() { - return completedDate; - } - - public void setCompletedDate(OffsetDateTime completedDate) { - this.completedDate = completedDate; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - TodoItem todoItem = (TodoItem) o; - return Objects.equals(this.id, todoItem.id) && - Objects.equals(this.listId, todoItem.listId) && - Objects.equals(this.name, todoItem.name) && - Objects.equals(this.description, todoItem.description) && - Objects.equals(this.state, todoItem.state) && - Objects.equals(this.dueDate, todoItem.dueDate) && - Objects.equals(this.completedDate, todoItem.completedDate); - } - - @Override - public int hashCode() { - return Objects.hash(id, listId, name, description, state, dueDate, completedDate); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class TodoItem {\n"); - sb.append(" id: ").append(toIndentedString(id)).append("\n"); - sb.append(" listId: ").append(toIndentedString(listId)).append("\n"); - sb.append(" name: ").append(toIndentedString(name)).append("\n"); - sb.append(" description: ").append(toIndentedString(description)).append("\n"); - sb.append(" state: ").append(toIndentedString(state)).append("\n"); - sb.append(" dueDate: ").append(toIndentedString(dueDate)).append("\n"); - sb.append(" completedDate: ").append(toIndentedString(completedDate)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - private String toIndentedString(Object o) { - if (o == null) { - return "null"; - } - return o.toString().replace("\n", "\n "); - } + @JsonProperty("id") + private String id; + + @JsonProperty("listId") + private String listId; + + @JsonProperty("name") + private String name; + + @JsonProperty("description") + private String description; + + @JsonProperty("state") + private TodoState state; + + @JsonProperty("dueDate") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + private OffsetDateTime dueDate; + + @JsonProperty("completedDate") + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) + private OffsetDateTime completedDate; + + public TodoItem id(String id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + */ + + @Schema(name = "id", required = false) + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public TodoItem listId(String listId) { + this.listId = listId; + return this; + } + + /** + * Get listId + * @return listId + */ + @NotNull + @Schema(name = "listId", required = true) + public String getListId() { + return listId; + } + + public void setListId(String listId) { + this.listId = listId; + } + + public TodoItem name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + */ + @NotNull + @Schema(name = "name", required = true) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TodoItem description(String description) { + this.description = description; + return this; + } + + /** + * Get description + * @return description + */ + @NotNull + @Schema(name = "description", required = true) + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public TodoItem state(TodoState state) { + this.state = state; + return this; + } + + /** + * Get state + * @return state + */ + @Valid + @Schema(name = "state", required = false) + public TodoState getState() { + return state; + } + + public void setState(TodoState state) { + this.state = state; + } + + public TodoItem dueDate(OffsetDateTime dueDate) { + this.dueDate = dueDate; + return this; + } + + /** + * Get dueDate + * @return dueDate + */ + @Valid + @Schema(name = "dueDate", required = false) + public OffsetDateTime getDueDate() { + return dueDate; + } + + public void setDueDate(OffsetDateTime dueDate) { + this.dueDate = dueDate; + } + + public TodoItem completedDate(OffsetDateTime completedDate) { + this.completedDate = completedDate; + return this; + } + + /** + * Get completedDate + * @return completedDate + */ + @Valid + @Schema(name = "completedDate", required = false) + public OffsetDateTime getCompletedDate() { + return completedDate; + } + + public void setCompletedDate(OffsetDateTime completedDate) { + this.completedDate = completedDate; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TodoItem todoItem = (TodoItem) o; + return Objects.equals(this.id, todoItem.id) && + Objects.equals(this.listId, todoItem.listId) && + Objects.equals(this.name, todoItem.name) && + Objects.equals(this.description, todoItem.description) && + Objects.equals(this.state, todoItem.state) && + Objects.equals(this.dueDate, todoItem.dueDate) && + Objects.equals(this.completedDate, todoItem.completedDate); + } + + @Override + public int hashCode() { + return Objects.hash(id, listId, name, description, state, dueDate, completedDate); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TodoItem {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" listId: ").append(toIndentedString(listId)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" description: ").append(toIndentedString(description)).append("\n"); + sb.append(" state: ").append(toIndentedString(state)).append("\n"); + sb.append(" dueDate: ").append(toIndentedString(dueDate)).append("\n"); + sb.append(" completedDate: ").append(toIndentedString(completedDate)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java index 1269377d8ad..e667387d99b 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoList.java @@ -1,128 +1,132 @@ package com.microsoft.azure.simpletodo.model; +import java.net.URI; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.*; import javax.annotation.Generated; -import javax.validation.constraints.NotNull; -import java.util.Objects; /** - * A list of related Todo items + * A list of related Todo items */ @Schema(name = "TodoList", description = " A list of related Todo items") -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:13:58.701016+01:00[Europe/Berlin]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") public class TodoList { - @JsonProperty("id") - private String id; - - @JsonProperty("name") - private String name; - - @JsonProperty("description") - private String description; - - public TodoList id(String id) { - this.id = id; - return this; - } - - /** - * Get id - * - * @return id - */ - - @Schema(name = "id", required = false) - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public TodoList name(String name) { - this.name = name; - return this; - } - - /** - * Get name - * - * @return name - */ - @NotNull - @Schema(name = "name", required = true) - public String getName() { - return name; + @JsonProperty("id") + private String id; + + @JsonProperty("name") + private String name; + + @JsonProperty("description") + private String description; + + public TodoList id(String id) { + this.id = id; + return this; + } + + /** + * Get id + * @return id + */ + + @Schema(name = "id", required = false) + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public TodoList name(String name) { + this.name = name; + return this; + } + + /** + * Get name + * @return name + */ + @NotNull + @Schema(name = "name", required = true) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TodoList description(String description) { + this.description = description; + return this; + } + + /** + * Get description + * @return description + */ + + @Schema(name = "description", required = false) + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; } - - public void setName(String name) { - this.name = name; - } - - public TodoList description(String description) { - this.description = description; - return this; - } - - /** - * Get description - * - * @return description - */ - - @Schema(name = "description", required = false) - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; + if (o == null || getClass() != o.getClass()) { + return false; } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - TodoList todoList = (TodoList) o; - return Objects.equals(this.id, todoList.id) && - Objects.equals(this.name, todoList.name) && - Objects.equals(this.description, todoList.description); - } - - @Override - public int hashCode() { - return Objects.hash(id, name, description); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class TodoList {\n"); - sb.append(" id: ").append(toIndentedString(id)).append("\n"); - sb.append(" name: ").append(toIndentedString(name)).append("\n"); - sb.append(" description: ").append(toIndentedString(description)).append("\n"); - sb.append("}"); - return sb.toString(); - } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - private String toIndentedString(Object o) { - if (o == null) { - return "null"; - } - return o.toString().replace("\n", "\n "); + TodoList todoList = (TodoList) o; + return Objects.equals(this.id, todoList.id) && + Objects.equals(this.name, todoList.name) && + Objects.equals(this.description, todoList.description); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, description); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class TodoList {\n"); + sb.append(" id: ").append(toIndentedString(id)).append("\n"); + sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" description: ").append(toIndentedString(description)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; } + return o.toString().replace("\n", "\n "); + } } diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java index 83e93391af5..773481722e2 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/model/TodoState.java @@ -1,47 +1,58 @@ package com.microsoft.azure.simpletodo.model; -import com.fasterxml.jackson.annotation.JsonCreator; +import java.net.URI; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonValue; +import org.openapitools.jackson.nullable.JsonNullable; +import java.time.OffsetDateTime; +import javax.validation.Valid; +import javax.validation.constraints.*; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.*; import javax.annotation.Generated; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + /** * Gets or Sets TodoState */ -@Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2022-03-15T23:13:58.701016+01:00[Europe/Berlin]") +@Generated(value = "org.openapitools.codegen.languages.SpringCodegen") public enum TodoState { - - TODO("todo"), - - INPROGRESS("inprogress"), - - DONE("done"); - - private String value; - - TodoState(String value) { - this.value = value; - } - - @JsonCreator - public static TodoState fromValue(String value) { - for (TodoState b : TodoState.values()) { - if (b.value.equals(value)) { - return b; - } - } - throw new IllegalArgumentException("Unexpected value '" + value + "'"); - } - - @JsonValue - public String getValue() { - return value; - } - - @Override - public String toString() { - return String.valueOf(value); + + TODO("todo"), + + INPROGRESS("inprogress"), + + DONE("done"); + + private String value; + + TodoState(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static TodoState fromValue(String value) { + for (TodoState b : TodoState.values()) { + if (b.value.equals(value)) { + return b; + } } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } } diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index 587f2dc346c..a73a5285e5a 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -10,3 +10,5 @@ spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAUL # Resolve connection string placholder from KeyVault. Fallback to project property if undefined. spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING:#{null}} spring.data.mongodb.database=todo + +springdoc.swagger-ui.use-root-path=true \ No newline at end of file diff --git a/templates/todo/projects/java-mongo-aca/.vscode/tasks.json b/templates/todo/projects/java-mongo-aca/.vscode/tasks.json index 166745cef91..59de83bc45c 100644 --- a/templates/todo/projects/java-mongo-aca/.vscode/tasks.json +++ b/templates/todo/projects/java-mongo-aca/.vscode/tasks.json @@ -24,7 +24,7 @@ { "label": "Build API", "command": "./mvnw", - "type": "process", + "type": "shell", "options": { "cwd": "${workspaceFolder}/src/api/" }, diff --git a/templates/todo/projects/java-mongo-aca/repo.yaml b/templates/todo/projects/java-mongo-aca/repo.yaml index cbaddc3d9f5..96071dcfd30 100644 --- a/templates/todo/projects/java-mongo-aca/repo.yaml +++ b/templates/todo/projects/java-mongo-aca/repo.yaml @@ -30,6 +30,11 @@ repo: to: ./src/web patterns: - "**/azure.@(yml|yaml)" + + - from: ../common/openapi.yaml + to: openapi.yaml + patterns: + - pom.xml assets: # Common assets From d8637bf0c55fa4fd4d8b40be5fa8327dc0f53476 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 15 Sep 2022 15:13:58 -0700 Subject: [PATCH 17/41] Clean up properties and readme --- templates/todo/api/java/README.md | 42 ++++++------------- .../src/main/resources/application.properties | 5 +-- 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/templates/todo/api/java/README.md b/templates/todo/api/java/README.md index ab879347942..a3a0dbf91fd 100644 --- a/templates/todo/api/java/README.md +++ b/templates/todo/api/java/README.md @@ -8,46 +8,28 @@ ### Local Environment -Create an `.env` file. -Set the property values by either providing a KeyVault endpoint, or to provide the secrets directly. +#### Environment variables -#### Option 1: Use KeyVault to provide secrets +The following environment variables are available for configuration: -Set `AZURE_KEY_VAULT_ENDPOINT`. With this set, other secret environment properties such as `AZURE_COSMOS_CONNECTION_STRING` are loaded from KeyVault. - -#### Option 2: Provide secrets directly - -Set `AZURE_COSMOS_CONNECTION_STRING`, the Cosmos DB connection string (Mongo DB also supported) - -#### Local ApplicationInsights telemetry - -To configure Application Insights locally, either - -- Set an environment variable `APPLICATIONINSIGHTS_CONNECTION_STRING` -- Update the `connectionString` defined in `applicationinsights.json` +- `AZURE_KEY_VAULT_ENDPOINT`. If set, other secret environment properties such as `AZURE_COSMOS_CONNECTION_STRING` are loaded from KeyVault. +- `AZURE_COSMOS_CONNECTION_STRING`. A direct override for specifying the Cosmos DB connection string (Mongo DB also supported). +- `APPLICATIONINSIGHTS_CONNECTION_STRING`. (Optional) Connection string of an Application Insights instance for telemetry to be logged. ### Build & Compile Run `./mvnw package` to build & compile the application in the `target` directory. +`./mvnw package -DskipTests` may be used instead to skip start-up tests that will require app configuration defined. ### Run the application locally Run `./mvnw spring-boot:run` to start the local development server. -The REST API will be available at `http://localhost:8080`. - -### Build the Docker image - -Run `./mvnw spring-boot:build-image` to build the Docker image. - -### Run the Docker image - -The environment variable `AZURE_COSMOS_CONNECTION_STRING` must point to the Cosmos DB connection string. - -Run `docker run -it -p 8080:8080 -e AZURE_COSMOS_CONNECTION_STRING=$AZURE_COSMOS_CONNECTION_STRING azure/azure-dev-todo-java` to start the Docker image. - -## Deploy to Azure App Service using Maven +The REST API will be available at `http://localhost:3100`. -The Maven property `basename` must point to the base name of your project. +### Build and run the Docker image -Run `./mvnw package azure-webapp:deploy -Dbasename=my-java-project` (and replace `my-java-project` by the base name of your project). +```bash +docker build . -t java-todo@latest +docker run -e AZURE_COSMOS_CONNECTION_STRING=$AZURE_COSMOS_CONNECTION_STRING -p 3100:3100 -t java-todo@latest +``` diff --git a/templates/todo/api/java/src/main/resources/application.properties b/templates/todo/api/java/src/main/resources/application.properties index a73a5285e5a..5fe37f08070 100644 --- a/templates/todo/api/java/src/main/resources/application.properties +++ b/templates/todo/api/java/src/main/resources/application.properties @@ -5,10 +5,9 @@ spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false # Import KeyVault secrets as properties spring.cloud.azure.keyvault.secret.property-sources[0].enabled=true -spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAULT_ENDPOINT:#{null}} +spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=${AZURE_KEY_VAULT_ENDPOINT} -# Resolve connection string placholder from KeyVault. Fallback to project property if undefined. -spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:@AZURE_COSMOS_CONNECTION_STRING:#{null}} +spring.data.mongodb.uri=${AZURE_COSMOS_CONNECTION_STRING:#{null}} spring.data.mongodb.database=todo springdoc.swagger-ui.use-root-path=true \ No newline at end of file From 8e36fcead0a06ef508d4560e8b691a66af38711e Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Fri, 16 Sep 2022 17:06:40 -0700 Subject: [PATCH 18/41] refactor and test --- .../pkg/project/framework_service_maven.go | 10 +- cli/azd/pkg/tools/javac/javac.go | 113 ++++++++++++++ cli/azd/pkg/tools/javac/javac_test.go | 87 +++++++++++ cli/azd/pkg/tools/maven/maven.go | 138 +++++++++--------- cli/azd/test/ostest/ostest.go | 58 ++++++++ 5 files changed, 332 insertions(+), 74 deletions(-) create mode 100644 cli/azd/pkg/tools/javac/javac.go create mode 100644 cli/azd/pkg/tools/javac/javac_test.go create mode 100644 cli/azd/test/ostest/ostest.go diff --git a/cli/azd/pkg/project/framework_service_maven.go b/cli/azd/pkg/project/framework_service_maven.go index 0c195e9d9cf..780e84d2180 100644 --- a/cli/azd/pkg/project/framework_service_maven.go +++ b/cli/azd/pkg/project/framework_service_maven.go @@ -6,6 +6,7 @@ import ( "github.com/azure/azure-dev/cli/azd/pkg/environment" "github.com/azure/azure-dev/cli/azd/pkg/tools" + "github.com/azure/azure-dev/cli/azd/pkg/tools/javac" "github.com/azure/azure-dev/cli/azd/pkg/tools/maven" ) @@ -13,10 +14,14 @@ type mavenProject struct { config *ServiceConfig env *environment.Environment mavenCli maven.MavenCli + javacCli javac.JavacCli } func (m *mavenProject) RequiredExternalTools() []tools.ExternalTool { - return []tools.ExternalTool{m.mavenCli} + return []tools.ExternalTool{ + m.mavenCli, + m.javacCli, + } } func (m *mavenProject) Package(ctx context.Context, progress chan<- string) (string, error) { @@ -44,6 +49,7 @@ func NewMavenProject(ctx context.Context, config *ServiceConfig, env *environmen return &mavenProject{ config: config, env: env, - mavenCli: maven.NewMavenCli(ctx), + mavenCli: maven.NewMavenCli(ctx, config.Path(), config.Project.Path), + javacCli: javac.NewCli(), } } diff --git a/cli/azd/pkg/tools/javac/javac.go b/cli/azd/pkg/tools/javac/javac.go new file mode 100644 index 00000000000..a1a7e7ef8d7 --- /dev/null +++ b/cli/azd/pkg/tools/javac/javac.go @@ -0,0 +1,113 @@ +package javac + +import ( + "context" + "errors" + "fmt" + "os" + osexec "os/exec" + "path/filepath" + + "github.com/azure/azure-dev/cli/azd/pkg/tools" + "github.com/blang/semver/v4" +) + +const javac = "javac" + +type JavacCli interface { + tools.ExternalTool +} + +type javacCli struct { +} + +func NewCli() JavacCli { + return &javacCli{} +} + +func (j *javacCli) VersionInfo() tools.VersionInfo { + return tools.VersionInfo{ + MinimumVersion: semver.Version{ + Major: 17, + Minor: 0, + Patch: 0}, + UpdateCommand: "Visit the website for your installed JDK to upgrade", + } +} + +func (j *javacCli) CheckInstalled(ctx context.Context) (bool, error) { + path, err := getInstalledPath() + if path != "" { + return false, err + } + + verOutput, err := tools.ExecuteCommand(ctx, path, "--version") + if err != nil { + return true, fmt.Errorf("checking javac version: %w", err) + } + + jdkVer, err := tools.ExtractSemver(verOutput) + if err != nil { + return true, fmt.Errorf("converting to semver version fails: %w", err) + } + + requiredVersion := j.VersionInfo() + if jdkVer.LT(requiredVersion.MinimumVersion) { + return false, &tools.ErrSemver{ToolName: j.Name(), VersionInfo: requiredVersion} + } + + return true, nil +} + +func (j *javacCli) InstallUrl() string { + return "https://www.microsoft.com/openjdk" +} + +func (j *javacCli) Name() string { + return "Java JDK" +} + +// getInstalledPath returns the installed javac path. +// +// javac is located by consulting, in search order: +// - JDK_HOME +// - JAVA_HOME +// - PATH +func getInstalledPath() (string, error) { + path := findByEnvVar("JDK_HOME") + if path != "" { + return path, nil + } + + path = findByEnvVar("JAVA_HOME") + if path != "" { + return path, nil + } + + path, err := osexec.LookPath(javac) + if err == nil { + return path, nil + } + if !errors.Is(err, osexec.ErrNotFound) { + return "", err + } + + return "", errors.New("javac could not be found in PATH, JAVA_HOME or JDK_HOME directory") +} + +// findByEnvVar returns the javac path by the following environment variable home directory. +// If javac is not found, an empty string is returned. +func findByEnvVar(envVar string) string { + home := os.Getenv(envVar) + if home == "" { + return "" + } + + absPath := filepath.Join(home, "bin", javac) + absPath, err := osexec.LookPath(absPath) + if err != nil { + return "" + } + + return absPath +} diff --git a/cli/azd/pkg/tools/javac/javac_test.go b/cli/azd/pkg/tools/javac/javac_test.go new file mode 100644 index 00000000000..f3bc46c8be5 --- /dev/null +++ b/cli/azd/pkg/tools/javac/javac_test.go @@ -0,0 +1,87 @@ +package javac + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/azure/azure-dev/cli/azd/test/ostest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_getInstalledPath(t *testing.T) { + jdkHome := t.TempDir() + jdkHomeBin := filepath.Join(jdkHome, "bin") + //require.NoError(t, os.Mkdir(jdkHomeBin, 755)) + + javaHome := t.TempDir() + javaHomeBin := filepath.Join(javaHome, "bin") + require.NoError(t, os.Mkdir(javaHomeBin, 755)) + + path := t.TempDir() + pathVal := fmt.Sprintf("%s%c%s", path, os.PathListSeparator, os.Getenv("PATH")) + ostest.UnsetTempEnv(t, "JDK_HOME") + ostest.UnsetTempEnv(t, "JAVA_HOME") + ostest.UnsetTempEnv(t, "PATH") + + tests := []struct { + name string + pathsPresent []string + envVar map[string]string + testWindowsPathExt bool + want string + wantErr bool + }{ + { + name: "JdkHome", + pathsPresent: []string{jdkHomeBin}, + envVar: map[string]string{"JDK_HOME": jdkHome, "JAVA_HOME": ""}, + want: filepath.Join(jdkHomeBin, "javac"), + wantErr: false, + }, + { + name: "JavaHome", + pathsPresent: []string{javaHomeBin}, + envVar: map[string]string{"JAVA_HOME": javaHome, "JDK_HOME": ""}, + want: filepath.Join(javaHomeBin, "javac"), + wantErr: false, + }, + { + name: "Path", + pathsPresent: []string{path}, + envVar: map[string]string{"PATH": pathVal}, + want: filepath.Join(path, "javac"), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for _, createPath := range tt.pathsPresent { + toCreate := filepath.Join(createPath, "javac") + // For Windows, we want to test EXT resolution behavior + if runtime.GOOS == "windows" { + toCreate += ".exe" + } + f, err := os.Create(toCreate) + require.NoError(t, err) + defer f.Close() + } + + ostest.SetTempEnvs(t, tt.envVar) + + actual, err := getInstalledPath() + if tt.wantErr { + assert.Error(t, err) + } else { + if runtime.GOOS == "windows" { + assert.Equal(t, tt.want+".exe", actual) + } else { + assert.Equal(t, tt.want, actual) + } + } + }) + } +} diff --git a/cli/azd/pkg/tools/maven/maven.go b/cli/azd/pkg/tools/maven/maven.go index 62fb6951e02..5950d76053c 100644 --- a/cli/azd/pkg/tools/maven/maven.go +++ b/cli/azd/pkg/tools/maven/maven.go @@ -6,13 +6,12 @@ import ( "fmt" "os" "path/filepath" - "runtime" + "sync" osexec "os/exec" "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/pkg/tools" - "github.com/blang/semver/v4" ) type MavenCli interface { @@ -22,7 +21,14 @@ type MavenCli interface { } type mavenCli struct { - commandRunner exec.CommandRunner + commandRunner exec.CommandRunner + projectPath string + rootProjectPath string + + // Lazily initialized. Access through mvnCmd. + mvnCmdStr string + mvnCmdOnce sync.Once + mvnCmdErr error } func (m *mavenCli) Name() string { @@ -33,106 +39,93 @@ func (m *mavenCli) InstallUrl() string { return "https://maven.apache.org" } -func (m *mavenCli) jdkVersionInfo() tools.VersionInfo { - return tools.VersionInfo{ - MinimumVersion: semver.Version{ - Major: 17, - Minor: 0, - Patch: 0}, - UpdateCommand: "Visit https://jdk.java.net/ to upgrade", - } -} - func (m *mavenCli) CheckInstalled(ctx context.Context) (bool, error) { - javac, err := getJavaCompilerPath() + _, err := m.mvnCmd() if err != nil { - return false, fmt.Errorf("checking java jdk installation: %s", err) + return false, err } - res, err := tools.ExecuteCommand(ctx, javac, "--version") - if err != nil { - return false, fmt.Errorf("checking javac version: %w", err) - } + return true, nil +} - javaSemver, err := tools.ExtractSemver(res) - if err != nil { - return false, fmt.Errorf("converting to semver version fails: %w", err) - } +func (m *mavenCli) mvnCmd() (string, error) { + m.mvnCmdOnce.Do(func() { + mvn, err := getMavenPath(m.projectPath, m.rootProjectPath) + if err != nil { + m.mvnCmdErr = err + } else { + m.mvnCmdStr = mvn + } + }) - updateDetail := m.jdkVersionInfo() - if javaSemver.LT(updateDetail.MinimumVersion) { - return false, &tools.ErrSemver{ToolName: "Java JDK", VersionInfo: m.jdkVersionInfo()} + if m.mvnCmdErr != nil { + return "", m.mvnCmdErr } - return true, nil + return m.mvnCmdStr, nil } -func getJavaCompilerPath() (string, error) { - javac := "javac" - path, err := osexec.LookPath(javac) - if err == nil { - return path, nil +func getMavenPath(projectPath string, rootProjectPath string) (string, error) { + mvnw, err := getMavenWrapperPath(projectPath, rootProjectPath) + if mvnw != "" { + return mvnw, nil } - if !errors.Is(err, osexec.ErrNotFound) { + if err != nil { return "", err } - home := os.Getenv("JAVA_HOME") - if home == "" { - return "", errors.New("java JDK not installed") - } - - absPath := filepath.Join(home, "bin", pathOptionalExt(javac, ".exe")) - _, err = os.Stat(absPath) + mvn, err := osexec.LookPath("mvn") if err == nil { - return absPath, nil + return mvn, nil } - if errors.Is(err, osexec.ErrNotFound) { - return "", fmt.Errorf("javac could not be found under JAVA_HOME directory. Expected javac to be present at: %s", absPath) + if !errors.Is(err, osexec.ErrNotFound) { + return "", err } - return "", err -} - -func pathOptionalExt(executable string, ext string) string { - if runtime.GOOS == "windows" { - return executable + ext - } else { - return executable - } + return "", errors.New("mvn could not be found in PATH or as mvnw in the project repository") } -func getMavenPath(projectPath string) (string, error) { - mvnw, ok := getMavenWrapperPath(projectPath) - if ok { - return mvnw, nil +// getMavenWrapperPath finds the path to mvnw in the project directory, up to the root project directory. +// +// An error is returned if an unexpected error occurred while finding. If mvnw is not found, an empty string is returned with no error. +func getMavenWrapperPath(projectPath string, rootProjectPath string) (string, error) { + searchDir, err := filepath.Abs(projectPath) + if err != nil { + return "", err } - mvn, err := osexec.LookPath("mvn") + root, err := filepath.Abs(rootProjectPath) if err != nil { return "", err } - return mvn, nil -} + for { + mvnw, err := osexec.LookPath(filepath.Join(searchDir, "mvnw")) + if err == nil { + return mvnw, nil + } -func getMavenWrapperPath(projectPath string) (string, bool) { - mvnw := pathOptionalExt(filepath.Join(projectPath, "mvnw"), ".cmd") - if _, err := os.Stat(mvnw); err != nil { - return "", false - } + if !errors.Is(err, os.ErrNotExist) { + return "", err + } - return mvnw, true + searchDir = filepath.Dir(searchDir) + + // Past root, terminate search and return not found + if len(searchDir) < len(root) { + return "", nil + } + } } func (cli *mavenCli) Package(ctx context.Context, projectPath string) error { - mvn, err := getMavenPath(projectPath) + mvnCmd, err := cli.mvnCmd() if err != nil { return err } - runArgs := exec.NewRunArgs(mvn, "package").WithCwd(projectPath) + runArgs := exec.NewRunArgs(mvnCmd, "package").WithCwd(projectPath) res, err := cli.commandRunner.Run(ctx, runArgs) if err != nil { return fmt.Errorf("mvn package on project '%s' failed: %s: %w", projectPath, res.String(), err) @@ -141,12 +134,11 @@ func (cli *mavenCli) Package(ctx context.Context, projectPath string) error { } func (cli *mavenCli) ResolveDependencies(ctx context.Context, projectPath string) error { - mvn, err := getMavenPath(projectPath) + mvnCmd, err := cli.mvnCmd() if err != nil { return err } - - runArgs := exec.NewRunArgs(mvn, "dependency:resolve").WithCwd(projectPath) + runArgs := exec.NewRunArgs(mvnCmd, "dependency:resolve").WithCwd(projectPath) res, err := cli.commandRunner.Run(ctx, runArgs) if err != nil { return fmt.Errorf("mvn dependency:resolve on project '%s' failed: %s: %w", projectPath, res.String(), err) @@ -154,8 +146,10 @@ func (cli *mavenCli) ResolveDependencies(ctx context.Context, projectPath string return nil } -func NewMavenCli(ctx context.Context) MavenCli { +func NewMavenCli(ctx context.Context, projectPath string, rootProjectPath string) MavenCli { return &mavenCli{ - commandRunner: exec.GetCommandRunner(ctx), + commandRunner: exec.GetCommandRunner(ctx), + projectPath: projectPath, + rootProjectPath: rootProjectPath, } } diff --git a/cli/azd/test/ostest/ostest.go b/cli/azd/test/ostest/ostest.go new file mode 100644 index 00000000000..67cdb9fdfd5 --- /dev/null +++ b/cli/azd/test/ostest/ostest.go @@ -0,0 +1,58 @@ +// Package ostest contains test helpers for os package. +package ostest + +import ( + "os" + "testing" +) + +// SetTempEnv sets the value of the environment variable named by the key. +// Any set values are automatically restored during test Cleanup. +func SetTempEnv(t *testing.T, key string, value string) { + orig, present := os.LookupEnv(key) + os.Setenv(key, value) + + t.Cleanup(func() { + if present { + os.Setenv(key, orig) + } else { + os.Unsetenv(key) + } + }) +} + +// UnsetTempEnv unsets the environment variable, which is later restored during test Cleanup. +func UnsetTempEnv(t *testing.T, key string) { + orig, present := os.LookupEnv(key) + os.Unsetenv(key) + + t.Cleanup(func() { + if present { + os.Setenv(key, orig) + } + }) +} + +// SetTempEnvs sets the provided environment variables keys with their corresponding values. +// Any set values are automatically restored during test Cleanup. +func SetTempEnvs(t *testing.T, envContext map[string]string) { + restoreContext := map[string]string{} + for key, value := range envContext { + orig, present := os.LookupEnv(key) + if present { + restoreContext[key] = orig + } + + os.Setenv(key, value) + } + + t.Cleanup(func() { + for key := range envContext { + if restoreValue, present := restoreContext[key]; present { + os.Setenv(key, restoreValue) + } else { + os.Unsetenv(key) + } + } + }) +} From 842e3033d4f9f057c390c7a84b9785063a9e91e1 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 19 Sep 2022 10:19:43 -0700 Subject: [PATCH 19/41] javac tests --- cli/azd/pkg/tools/javac/javac.go | 37 ++++++---- cli/azd/pkg/tools/javac/javac_test.go | 98 +++++++++++++++++---------- cli/azd/test/ostest/ostest.go | 23 +++++++ 3 files changed, 110 insertions(+), 48 deletions(-) diff --git a/cli/azd/pkg/tools/javac/javac.go b/cli/azd/pkg/tools/javac/javac.go index a1a7e7ef8d7..b7d1ec7235c 100644 --- a/cli/azd/pkg/tools/javac/javac.go +++ b/cli/azd/pkg/tools/javac/javac.go @@ -70,44 +70,53 @@ func (j *javacCli) Name() string { // getInstalledPath returns the installed javac path. // // javac is located by consulting, in search order: -// - JDK_HOME -// - JAVA_HOME +// - JDK_HOME (if set) +// - JAVA_HOME (if set) // - PATH +// +// An error is returned if javac could not be found, or if invalid locations are provided. func getInstalledPath() (string, error) { - path := findByEnvVar("JDK_HOME") + path, err := findByEnvVar("JDK_HOME") if path != "" { return path, nil } + if err != nil { + return "", err + } - path = findByEnvVar("JAVA_HOME") + path, err = findByEnvVar("JAVA_HOME") if path != "" { return path, nil } + if err != nil { + return "", err + } - path, err := osexec.LookPath(javac) + path, err = osexec.LookPath(javac) if err == nil { return path, nil } - if !errors.Is(err, osexec.ErrNotFound) { - return "", err - } - return "", errors.New("javac could not be found in PATH, JAVA_HOME or JDK_HOME directory") + return "", errors.New( + "javac could not be found. Set either JAVA_HOME or JDK_HOME environment variable to point to your Java installation, " + + "or include javac in your PATH environment variable") } // findByEnvVar returns the javac path by the following environment variable home directory. -// If javac is not found, an empty string is returned. -func findByEnvVar(envVar string) string { +// +// An error is returned if an error occurred while finding. +// If the environment variable home directory is unset, an empty string is returned with no error. +func findByEnvVar(envVar string) (string, error) { home := os.Getenv(envVar) if home == "" { - return "" + return "", nil } absPath := filepath.Join(home, "bin", javac) absPath, err := osexec.LookPath(absPath) if err != nil { - return "" + return "", fmt.Errorf("%s is set to an invalid directory: %w", envVar, err) } - return absPath + return absPath, nil } diff --git a/cli/azd/pkg/tools/javac/javac_test.go b/cli/azd/pkg/tools/javac/javac_test.go index f3bc46c8be5..bb59bc0a8a0 100644 --- a/cli/azd/pkg/tools/javac/javac_test.go +++ b/cli/azd/pkg/tools/javac/javac_test.go @@ -1,6 +1,7 @@ package javac import ( + "errors" "fmt" "os" "path/filepath" @@ -15,56 +16,69 @@ import ( func Test_getInstalledPath(t *testing.T) { jdkHome := t.TempDir() jdkHomeBin := filepath.Join(jdkHome, "bin") - //require.NoError(t, os.Mkdir(jdkHomeBin, 755)) + require.NoError(t, os.Mkdir(jdkHomeBin, 0755)) javaHome := t.TempDir() javaHomeBin := filepath.Join(javaHome, "bin") - require.NoError(t, os.Mkdir(javaHomeBin, 755)) + require.NoError(t, os.Mkdir(javaHomeBin, 0755)) - path := t.TempDir() - pathVal := fmt.Sprintf("%s%c%s", path, os.PathListSeparator, os.Getenv("PATH")) - ostest.UnsetTempEnv(t, "JDK_HOME") - ostest.UnsetTempEnv(t, "JAVA_HOME") - ostest.UnsetTempEnv(t, "PATH") + origPath := os.Getenv("PATH") + pathBin := t.TempDir() + pathVal := fmt.Sprintf("%s%c%s", pathBin, os.PathListSeparator, origPath) + ostest.UnsetTempEnvs(t, []string{"JDK_HOME", "JAVA_HOME", "PATH"}) tests := []struct { name string - pathsPresent []string + javacPaths []string envVar map[string]string testWindowsPathExt bool want string wantErr bool }{ { - name: "JdkHome", - pathsPresent: []string{jdkHomeBin}, - envVar: map[string]string{"JDK_HOME": jdkHome, "JAVA_HOME": ""}, - want: filepath.Join(jdkHomeBin, "javac"), - wantErr: false, + name: "JdkHome", + javacPaths: []string{jdkHomeBin}, + envVar: map[string]string{"JDK_HOME": jdkHome}, + want: jdkHomeBin, + wantErr: false, }, { - name: "JavaHome", - pathsPresent: []string{javaHomeBin}, - envVar: map[string]string{"JAVA_HOME": javaHome, "JDK_HOME": ""}, - want: filepath.Join(javaHomeBin, "javac"), - wantErr: false, + name: "JavaHome", + javacPaths: []string{javaHomeBin}, + envVar: map[string]string{"JAVA_HOME": javaHome}, + want: javaHomeBin, + wantErr: false, }, { - name: "Path", - pathsPresent: []string{path}, - envVar: map[string]string{"PATH": pathVal}, - want: filepath.Join(path, "javac"), - wantErr: false, + name: "Path", + javacPaths: []string{pathBin}, + envVar: map[string]string{"PATH": pathVal}, + want: pathBin, + wantErr: false, }, + { + name: "SearchJdkHomeFirst", + javacPaths: []string{jdkHomeBin, javaHomeBin, pathBin}, + envVar: map[string]string{"JDK_HOME": jdkHome, "JAVA_HOME": javaHome, "PATH": pathVal}, + want: jdkHomeBin, + wantErr: false, + }, + { + name: "SearchJavaHomeSecond", + javacPaths: []string{javaHomeBin, pathBin}, + envVar: map[string]string{"JAVA_HOME": javaHome, "PATH": pathVal}, + want: javaHomeBin, + wantErr: false, + }, + {name: "InvalidJdkHome", envVar: map[string]string{"JDK_HOME": jdkHome}, wantErr: true}, + {name: "InvalidJavaHome", envVar: map[string]string{"JAVA_HOME": javaHome}, wantErr: true}, + {name: "NotFound", envVar: map[string]string{"PATH": pathBin}, wantErr: true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - for _, createPath := range tt.pathsPresent { - toCreate := filepath.Join(createPath, "javac") - // For Windows, we want to test EXT resolution behavior - if runtime.GOOS == "windows" { - toCreate += ".exe" - } + cleanJavac(t, javaHomeBin, jdkHomeBin, pathBin) + for _, createPath := range tt.javacPaths { + toCreate := filepath.Join(createPath, javacWithExt()) f, err := os.Create(toCreate) require.NoError(t, err) defer f.Close() @@ -76,12 +90,28 @@ func Test_getInstalledPath(t *testing.T) { if tt.wantErr { assert.Error(t, err) } else { - if runtime.GOOS == "windows" { - assert.Equal(t, tt.want+".exe", actual) - } else { - assert.Equal(t, tt.want, actual) - } + assert.NoError(t, err) + assert.Equal(t, filepath.Join(tt.want, javacWithExt()), actual) } }) } } + +func javacWithExt() string { + if runtime.GOOS == "windows" { + // For Windows, we want to test EXT resolution behavior + return javac + ".exe" + } else { + return javac + } +} + +func cleanJavac(t *testing.T, dirs ...string) { + for _, dir := range dirs { + err := os.Remove(filepath.Join(dir, javacWithExt())) + + if !errors.Is(err, os.ErrNotExist) { + require.NoError(t, err) + } + } +} diff --git a/cli/azd/test/ostest/ostest.go b/cli/azd/test/ostest/ostest.go index 67cdb9fdfd5..624835ab4b2 100644 --- a/cli/azd/test/ostest/ostest.go +++ b/cli/azd/test/ostest/ostest.go @@ -33,6 +33,29 @@ func UnsetTempEnv(t *testing.T, key string) { }) } +// UnsetTempEnv unsets the provided environment variables, which is later restored during test Cleanup. +func UnsetTempEnvs(t *testing.T, keys []string) { + restoreContext := map[string]string{} + + for _, key := range keys { + orig, present := os.LookupEnv(key) + if present { + restoreContext[key] = orig + os.Unsetenv(key) + } + } + + if len(restoreContext) > 0 { + t.Cleanup(func() { + for _, key := range keys { + if restoreValue, present := restoreContext[key]; present { + os.Setenv(key, restoreValue) + } + } + }) + } +} + // SetTempEnvs sets the provided environment variables keys with their corresponding values. // Any set values are automatically restored during test Cleanup. func SetTempEnvs(t *testing.T, envContext map[string]string) { From 8cf939360733e8672d8e3a8289786932e2c4edf1 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 19 Sep 2022 10:55:48 -0700 Subject: [PATCH 20/41] javac tests --- .../pkg/project/framework_service_maven.go | 7 +- cli/azd/pkg/project/service_config.go | 3 +- cli/azd/pkg/tools/javac/javac.go | 21 ++++-- cli/azd/pkg/tools/javac/javac_test.go | 71 +++++++++++++++---- cli/azd/pkg/tools/maven/maven.go | 4 +- 5 files changed, 81 insertions(+), 25 deletions(-) diff --git a/cli/azd/pkg/project/framework_service_maven.go b/cli/azd/pkg/project/framework_service_maven.go index 780e84d2180..98bafa34a85 100644 --- a/cli/azd/pkg/project/framework_service_maven.go +++ b/cli/azd/pkg/project/framework_service_maven.go @@ -5,6 +5,7 @@ import ( "path/filepath" "github.com/azure/azure-dev/cli/azd/pkg/environment" + "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/pkg/tools" "github.com/azure/azure-dev/cli/azd/pkg/tools/javac" "github.com/azure/azure-dev/cli/azd/pkg/tools/maven" @@ -45,11 +46,11 @@ func (m *mavenProject) Initialize(ctx context.Context) error { return nil } -func NewMavenProject(ctx context.Context, config *ServiceConfig, env *environment.Environment) FrameworkService { +func NewMavenProject(commandRunner exec.CommandRunner, config *ServiceConfig, env *environment.Environment) FrameworkService { return &mavenProject{ config: config, env: env, - mavenCli: maven.NewMavenCli(ctx, config.Path(), config.Project.Path), - javacCli: javac.NewCli(), + mavenCli: maven.NewMavenCli(commandRunner, config.Path(), config.Project.Path), + javacCli: javac.NewCli(commandRunner), } } diff --git a/cli/azd/pkg/project/service_config.go b/cli/azd/pkg/project/service_config.go index 647dc5c7a85..7373db7abf6 100644 --- a/cli/azd/pkg/project/service_config.go +++ b/cli/azd/pkg/project/service_config.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/azure/azure-dev/cli/azd/pkg/environment" + "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/pkg/infra/provisioning" "github.com/azure/azure-dev/cli/azd/pkg/input" "github.com/azure/azure-dev/cli/azd/pkg/tools/azcli" @@ -109,7 +110,7 @@ func (sc *ServiceConfig) GetFrameworkService(ctx context.Context, env *environme case "js", "ts": frameworkService = NewNpmProject(ctx, sc, env) case "java": - frameworkService = NewMavenProject(ctx, sc, env) + frameworkService = NewMavenProject(exec.GetCommandRunner(ctx), sc, env) default: return nil, fmt.Errorf("unsupported language '%s' for service '%s'", sc.Language, sc.Name) } diff --git a/cli/azd/pkg/tools/javac/javac.go b/cli/azd/pkg/tools/javac/javac.go index b7d1ec7235c..2255cd00096 100644 --- a/cli/azd/pkg/tools/javac/javac.go +++ b/cli/azd/pkg/tools/javac/javac.go @@ -8,6 +8,7 @@ import ( osexec "os/exec" "path/filepath" + "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/pkg/tools" "github.com/blang/semver/v4" ) @@ -19,10 +20,13 @@ type JavacCli interface { } type javacCli struct { + cmdRun exec.CommandRunner } -func NewCli() JavacCli { - return &javacCli{} +func NewCli(cmdRun exec.CommandRunner) JavacCli { + return &javacCli{ + cmdRun: cmdRun, + } } func (j *javacCli) VersionInfo() tools.VersionInfo { @@ -37,18 +41,21 @@ func (j *javacCli) VersionInfo() tools.VersionInfo { func (j *javacCli) CheckInstalled(ctx context.Context) (bool, error) { path, err := getInstalledPath() - if path != "" { + if err != nil { return false, err } - verOutput, err := tools.ExecuteCommand(ctx, path, "--version") + runResult, err := j.cmdRun.Run(ctx, exec.RunArgs{ + Cmd: path, + Args: []string{"--version"}, + }) if err != nil { - return true, fmt.Errorf("checking javac version: %w", err) + return false, fmt.Errorf("checking javac version: %w", err) } - jdkVer, err := tools.ExtractSemver(verOutput) + jdkVer, err := tools.ExtractSemver(runResult.Stdout) if err != nil { - return true, fmt.Errorf("converting to semver version fails: %w", err) + return false, fmt.Errorf("converting to semver version fails: %w", err) } requiredVersion := j.VersionInfo() diff --git a/cli/azd/pkg/tools/javac/javac_test.go b/cli/azd/pkg/tools/javac/javac_test.go index bb59bc0a8a0..f8b937b632a 100644 --- a/cli/azd/pkg/tools/javac/javac_test.go +++ b/cli/azd/pkg/tools/javac/javac_test.go @@ -1,6 +1,7 @@ package javac import ( + "context" "errors" "fmt" "os" @@ -8,11 +9,52 @@ import ( "runtime" "testing" + azdexec "github.com/azure/azure-dev/cli/azd/pkg/exec" + mockexec "github.com/azure/azure-dev/cli/azd/test/mocks/exec" "github.com/azure/azure-dev/cli/azd/test/ostest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +func TestCheckInstalledVersion(t *testing.T) { + javaHome := t.TempDir() + javaHomeBin := filepath.Join(javaHome, "bin") + require.NoError(t, os.Mkdir(javaHomeBin, 0755)) + + installJavac(t, javaHomeBin) + ostest.SetTempEnv(t, "JAVA_HOME", javaHome) + + tests := []struct { + name string + stdOut string + want bool + wantErr bool + }{ + {name: "MetExact", stdOut: "javac 17.0.0.0", want: true}, + {name: "Met", stdOut: "javac 18.0.2.1", want: true}, + {name: "NotMet", stdOut: "javac 15.0.0.0", wantErr: true}, + {name: "InvalidSemVer", stdOut: "javac NoVer", wantErr: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + execMock := mockexec.NewMockCommandRunner(). + When(func(a azdexec.RunArgs, command string) bool { return true }). + Respond(azdexec.NewRunResult(0, tt.stdOut, "")) + + cli := NewCli(execMock) + ok, err := cli.CheckInstalled(context.Background()) + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, tt.want, ok) + }) + } +} + func Test_getInstalledPath(t *testing.T) { jdkHome := t.TempDir() jdkHomeBin := filepath.Join(jdkHome, "bin") @@ -39,35 +81,35 @@ func Test_getInstalledPath(t *testing.T) { name: "JdkHome", javacPaths: []string{jdkHomeBin}, envVar: map[string]string{"JDK_HOME": jdkHome}, - want: jdkHomeBin, + want: filepath.Join(jdkHomeBin, javacWithExt()), wantErr: false, }, { name: "JavaHome", javacPaths: []string{javaHomeBin}, envVar: map[string]string{"JAVA_HOME": javaHome}, - want: javaHomeBin, + want: filepath.Join(javaHomeBin, javacWithExt()), wantErr: false, }, { name: "Path", javacPaths: []string{pathBin}, envVar: map[string]string{"PATH": pathVal}, - want: pathBin, + want: filepath.Join(pathBin, javacWithExt()), wantErr: false, }, { name: "SearchJdkHomeFirst", javacPaths: []string{jdkHomeBin, javaHomeBin, pathBin}, envVar: map[string]string{"JDK_HOME": jdkHome, "JAVA_HOME": javaHome, "PATH": pathVal}, - want: jdkHomeBin, + want: filepath.Join(jdkHomeBin, javacWithExt()), wantErr: false, }, { name: "SearchJavaHomeSecond", javacPaths: []string{javaHomeBin, pathBin}, envVar: map[string]string{"JAVA_HOME": javaHome, "PATH": pathVal}, - want: javaHomeBin, + want: filepath.Join(javaHomeBin, javacWithExt()), wantErr: false, }, {name: "InvalidJdkHome", envVar: map[string]string{"JDK_HOME": jdkHome}, wantErr: true}, @@ -77,12 +119,7 @@ func Test_getInstalledPath(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cleanJavac(t, javaHomeBin, jdkHomeBin, pathBin) - for _, createPath := range tt.javacPaths { - toCreate := filepath.Join(createPath, javacWithExt()) - f, err := os.Create(toCreate) - require.NoError(t, err) - defer f.Close() - } + installJavac(t, tt.javacPaths...) ostest.SetTempEnvs(t, tt.envVar) @@ -91,12 +128,22 @@ func Test_getInstalledPath(t *testing.T) { assert.Error(t, err) } else { assert.NoError(t, err) - assert.Equal(t, filepath.Join(tt.want, javacWithExt()), actual) } + + assert.Equal(t, tt.want, actual) }) } } +func installJavac(t *testing.T, dirs ...string) { + for _, createPath := range dirs { + toCreate := filepath.Join(createPath, javacWithExt()) + f, err := os.Create(toCreate) + require.NoError(t, err) + defer f.Close() + } +} + func javacWithExt() string { if runtime.GOOS == "windows" { // For Windows, we want to test EXT resolution behavior diff --git a/cli/azd/pkg/tools/maven/maven.go b/cli/azd/pkg/tools/maven/maven.go index 5950d76053c..84b68c003be 100644 --- a/cli/azd/pkg/tools/maven/maven.go +++ b/cli/azd/pkg/tools/maven/maven.go @@ -146,9 +146,9 @@ func (cli *mavenCli) ResolveDependencies(ctx context.Context, projectPath string return nil } -func NewMavenCli(ctx context.Context, projectPath string, rootProjectPath string) MavenCli { +func NewMavenCli(commandRunner exec.CommandRunner, projectPath string, rootProjectPath string) MavenCli { return &mavenCli{ - commandRunner: exec.GetCommandRunner(ctx), + commandRunner: commandRunner, projectPath: projectPath, rootProjectPath: rootProjectPath, } From 5d1f65d3c3bd0f2d5d5047906f892bb74d3e14b4 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 19 Sep 2022 12:28:17 -0700 Subject: [PATCH 21/41] add maven tests --- cli/azd/pkg/tools/javac/javac.go | 4 + cli/azd/pkg/tools/javac/javac_test.go | 29 ++------ cli/azd/pkg/tools/maven/maven.go | 10 +-- cli/azd/pkg/tools/maven/maven_test.go | 103 ++++++++++++++++++++++++++ cli/azd/test/ostest/ostest.go | 59 +++++++++++++-- 5 files changed, 170 insertions(+), 35 deletions(-) create mode 100644 cli/azd/pkg/tools/maven/maven_test.go diff --git a/cli/azd/pkg/tools/javac/javac.go b/cli/azd/pkg/tools/javac/javac.go index 2255cd00096..62d425b09be 100644 --- a/cli/azd/pkg/tools/javac/javac.go +++ b/cli/azd/pkg/tools/javac/javac.go @@ -104,6 +104,10 @@ func getInstalledPath() (string, error) { return path, nil } + if !errors.Is(err, osexec.ErrNotFound) { + return "", fmt.Errorf("failed looking up javac in PATH: %w", err) + } + return "", errors.New( "javac could not be found. Set either JAVA_HOME or JDK_HOME environment variable to point to your Java installation, " + "or include javac in your PATH environment variable") diff --git a/cli/azd/pkg/tools/javac/javac_test.go b/cli/azd/pkg/tools/javac/javac_test.go index f8b937b632a..8b667c989ad 100644 --- a/cli/azd/pkg/tools/javac/javac_test.go +++ b/cli/azd/pkg/tools/javac/javac_test.go @@ -2,7 +2,6 @@ package javac import ( "context" - "errors" "fmt" "os" "path/filepath" @@ -21,8 +20,8 @@ func TestCheckInstalledVersion(t *testing.T) { javaHomeBin := filepath.Join(javaHome, "bin") require.NoError(t, os.Mkdir(javaHomeBin, 0755)) - installJavac(t, javaHomeBin) - ostest.SetTempEnv(t, "JAVA_HOME", javaHome) + ostest.CreateNoCleanup(t, filepath.Join(javaHomeBin, javacWithExt())) + ostest.Setenv(t, "JAVA_HOME", javaHome) tests := []struct { name string @@ -67,7 +66,7 @@ func Test_getInstalledPath(t *testing.T) { origPath := os.Getenv("PATH") pathBin := t.TempDir() pathVal := fmt.Sprintf("%s%c%s", pathBin, os.PathListSeparator, origPath) - ostest.UnsetTempEnvs(t, []string{"JDK_HOME", "JAVA_HOME", "PATH"}) + ostest.Unsetenvs(t, []string{"JDK_HOME", "JAVA_HOME", "PATH"}) tests := []struct { name string @@ -118,10 +117,8 @@ func Test_getInstalledPath(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - cleanJavac(t, javaHomeBin, jdkHomeBin, pathBin) - installJavac(t, tt.javacPaths...) - - ostest.SetTempEnvs(t, tt.envVar) + placeJavac(t, tt.javacPaths...) + ostest.Setenvs(t, tt.envVar) actual, err := getInstalledPath() if tt.wantErr { @@ -135,12 +132,10 @@ func Test_getInstalledPath(t *testing.T) { } } -func installJavac(t *testing.T, dirs ...string) { +func placeJavac(t *testing.T, dirs ...string) { for _, createPath := range dirs { toCreate := filepath.Join(createPath, javacWithExt()) - f, err := os.Create(toCreate) - require.NoError(t, err) - defer f.Close() + ostest.Create(t, toCreate) } } @@ -152,13 +147,3 @@ func javacWithExt() string { return javac } } - -func cleanJavac(t *testing.T, dirs ...string) { - for _, dir := range dirs { - err := os.Remove(filepath.Join(dir, javacWithExt())) - - if !errors.Is(err, os.ErrNotExist) { - require.NoError(t, err) - } - } -} diff --git a/cli/azd/pkg/tools/maven/maven.go b/cli/azd/pkg/tools/maven/maven.go index 84b68c003be..99f6d96cb2d 100644 --- a/cli/azd/pkg/tools/maven/maven.go +++ b/cli/azd/pkg/tools/maven/maven.go @@ -50,11 +50,11 @@ func (m *mavenCli) CheckInstalled(ctx context.Context) (bool, error) { func (m *mavenCli) mvnCmd() (string, error) { m.mvnCmdOnce.Do(func() { - mvn, err := getMavenPath(m.projectPath, m.rootProjectPath) + mvnCmd, err := getMavenPath(m.projectPath, m.rootProjectPath) if err != nil { m.mvnCmdErr = err } else { - m.mvnCmdStr = mvn + m.mvnCmdStr = mvnCmd } }) @@ -72,7 +72,7 @@ func getMavenPath(projectPath string, rootProjectPath string) (string, error) { } if err != nil { - return "", err + return "", fmt.Errorf("failed finding mvnw in repository path: %w", err) } mvn, err := osexec.LookPath("mvn") @@ -81,10 +81,10 @@ func getMavenPath(projectPath string, rootProjectPath string) (string, error) { } if !errors.Is(err, osexec.ErrNotFound) { - return "", err + return "", fmt.Errorf("failed looking up mvn in PATH: %w", err) } - return "", errors.New("mvn could not be found in PATH or as mvnw in the project repository") + return "", errors.New("maven could not be found. Install either Maven or Maven Wrapper by visiting https://maven.apache.org/ or https://maven.apache.org/wrapper/") } // getMavenWrapperPath finds the path to mvnw in the project directory, up to the root project directory. diff --git a/cli/azd/pkg/tools/maven/maven_test.go b/cli/azd/pkg/tools/maven/maven_test.go new file mode 100644 index 00000000000..b4c9ddf9ec6 --- /dev/null +++ b/cli/azd/pkg/tools/maven/maven_test.go @@ -0,0 +1,103 @@ +package maven + +import ( + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/azure/azure-dev/cli/azd/test/ostest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_getMavenPath(t *testing.T) { + rootPath := os.TempDir() + sourcePath := filepath.Join(rootPath, "src") + projectPath := filepath.Join(sourcePath, "api") + + pathDir := os.TempDir() + + require.NoError(t, os.MkdirAll(projectPath, 0755)) + ostest.Unsetenv(t, "PATH") + + type args struct { + projectPath string + rootProjectPath string + } + + tests := []struct { + name string + mvnwPath []string + mvnwRelative bool + mvnPath []string + envVar map[string]string + want string + wantErr bool + }{ + {name: "MvnwProjectPath", mvnwPath: []string{projectPath}, want: filepath.Join(projectPath, mvnwWithExt())}, + {name: "MvnwSrcPath", mvnwPath: []string{sourcePath}, want: filepath.Join(sourcePath, mvnwWithExt())}, + {name: "MvnwRootPath", mvnwPath: []string{rootPath}, want: filepath.Join(rootPath, mvnwWithExt())}, + {name: "MvnwFirst", mvnwPath: []string{rootPath}, want: filepath.Join(rootPath, mvnwWithExt()), + mvnPath: []string{pathDir}, envVar: map[string]string{"PATH": pathDir}}, + {name: "MvnwProjectPathRelative", mvnwPath: []string{projectPath}, want: filepath.Join(projectPath, mvnwWithExt()), mvnwRelative: true}, + {name: "MvnwSrcPathRelative", mvnwPath: []string{sourcePath}, want: filepath.Join(sourcePath, mvnwWithExt()), mvnwRelative: true}, + {name: "MvnwRootPathRelative", mvnwPath: []string{rootPath}, want: filepath.Join(rootPath, mvnwWithExt()), mvnwRelative: true}, + {name: "Mvn", mvnPath: []string{pathDir}, envVar: map[string]string{"PATH": pathDir}, want: filepath.Join(pathDir, mvnWithExt())}, + {name: "NotFound", want: "", wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + place(t, mvnwWithExt(), tt.mvnwPath...) + place(t, mvnWithExt(), tt.mvnPath...) + ostest.Setenvs(t, tt.envVar) + + args := args{} + if tt.mvnwRelative { + ostest.Chdir(t, rootPath) + projectPathRel, err := filepath.Rel(rootPath, projectPath) + require.NoError(t, err) + args.projectPath = projectPathRel + args.rootProjectPath = "" + } else { + args.projectPath = projectPath + args.rootProjectPath = rootPath + } + + actual, err := getMavenPath(args.projectPath, args.rootProjectPath) + + if tt.wantErr { + assert.Error(t, err) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, tt.want, actual) + }) + } +} + +func place(t *testing.T, name string, dirs ...string) { + for _, createPath := range dirs { + toCreate := filepath.Join(createPath, name) + ostest.Create(t, toCreate) + } +} + +func mvnWithExt() string { + if runtime.GOOS == "windows" { + // For Windows, we want to test EXT resolution behavior + return "mvn.cmd" + } else { + return "mvn" + } +} + +func mvnwWithExt() string { + if runtime.GOOS == "windows" { + // For Windows, we want to test EXT resolution behavior + return "mvnw.cmd" + } else { + return "mvnw" + } +} diff --git a/cli/azd/test/ostest/ostest.go b/cli/azd/test/ostest/ostest.go index 624835ab4b2..a4a6deafd89 100644 --- a/cli/azd/test/ostest/ostest.go +++ b/cli/azd/test/ostest/ostest.go @@ -2,13 +2,16 @@ package ostest import ( + "errors" "os" "testing" + + "github.com/stretchr/testify/require" ) -// SetTempEnv sets the value of the environment variable named by the key. +// Setenv sets the value of the environment variable named by the key. // Any set values are automatically restored during test Cleanup. -func SetTempEnv(t *testing.T, key string, value string) { +func Setenv(t *testing.T, key string, value string) { orig, present := os.LookupEnv(key) os.Setenv(key, value) @@ -21,8 +24,8 @@ func SetTempEnv(t *testing.T, key string, value string) { }) } -// UnsetTempEnv unsets the environment variable, which is later restored during test Cleanup. -func UnsetTempEnv(t *testing.T, key string) { +// Unsetenv unsets the environment variable, which is later restored during test Cleanup. +func Unsetenv(t *testing.T, key string) { orig, present := os.LookupEnv(key) os.Unsetenv(key) @@ -33,8 +36,8 @@ func UnsetTempEnv(t *testing.T, key string) { }) } -// UnsetTempEnv unsets the provided environment variables, which is later restored during test Cleanup. -func UnsetTempEnvs(t *testing.T, keys []string) { +// Unsetenvs unsets the provided environment variables, which is later restored during test Cleanup. +func Unsetenvs(t *testing.T, keys []string) { restoreContext := map[string]string{} for _, key := range keys { @@ -56,9 +59,9 @@ func UnsetTempEnvs(t *testing.T, keys []string) { } } -// SetTempEnvs sets the provided environment variables keys with their corresponding values. +// Setenvs sets the provided environment variables keys with their corresponding values. // Any set values are automatically restored during test Cleanup. -func SetTempEnvs(t *testing.T, envContext map[string]string) { +func Setenvs(t *testing.T, envContext map[string]string) { restoreContext := map[string]string{} for key, value := range envContext { orig, present := os.LookupEnv(key) @@ -79,3 +82,43 @@ func SetTempEnvs(t *testing.T, envContext map[string]string) { } }) } + +// Create creates or truncates the named file. If the file already exists, +// it is truncated. If the file does not exist, it is created with mode 0666 +// (before umask). +// Files created are automatically removed during test Cleanup. Ignores errors +// due to the file already being deleted. +func Create(t *testing.T, name string) { + CreateNoCleanup(t, name) + + t.Cleanup(func() { + err := os.Remove(name) + if !errors.Is(err, os.ErrNotExist) { + require.NoError(t, err) + } + }) +} + +// Create creates or truncates the named file. If the file already exists, +// it is truncated. If the file does not exist, it is created with mode 0666 +// (before umask). +func CreateNoCleanup(t *testing.T, name string) { + f, err := os.Create(name) + require.NoError(t, err) + defer f.Close() +} + +// Chdir changes the current working directory to the named directory. +// The working directory is automatically restored as part of Cleanup. +func Chdir(t *testing.T, dir string) { + wd, err := os.Getwd() + require.NoError(t, err) + + err = os.Chdir(dir) + require.NoError(t, err) + + t.Cleanup(func() { + err = os.Chdir(wd) + require.NoError(t, err) + }) +} From afc55951704cf6629a53d8fd8a19f9656120a24c Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 19 Sep 2022 15:00:00 -0700 Subject: [PATCH 22/41] Update bicep templates --- .../infra/bicep/core/host/container-app.bicep | 10 + .../infra/bicep/app/api-container-app.bicep | 8 + .../infra/bicep/app/web-container-app.bicep | 8 + .../{ => .repo/bicep}/azure.yaml | 0 .../.repo/bicep/infra/main.bicep | 52 ++++++ .../.repo/bicep/infra/main.parameters.json | 21 +++ .../.repo/bicep/infra/resources.bicep | 83 +++++++++ .../java-mongo-aca/.repo/bicep/repo.yaml | 172 ++++++++++++++++++ .../todo/projects/java-mongo-aca/repo.yaml | 96 ---------- 9 files changed, 354 insertions(+), 96 deletions(-) rename templates/todo/projects/java-mongo-aca/{ => .repo/bicep}/azure.yaml (100%) create mode 100644 templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.bicep create mode 100644 templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.parameters.json create mode 100644 templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep create mode 100644 templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml delete mode 100644 templates/todo/projects/java-mongo-aca/repo.yaml diff --git a/templates/common/infra/bicep/core/host/container-app.bicep b/templates/common/infra/bicep/core/host/container-app.bicep index fdfcf6777ad..99d08717229 100644 --- a/templates/common/infra/bicep/core/host/container-app.bicep +++ b/templates/common/infra/bicep/core/host/container-app.bicep @@ -11,6 +11,12 @@ param managedIdentity bool = !(empty(keyVaultName)) param targetPort int = 80 param serviceName string +@description('CPU cores allocated to a single container instance, e.g. 0.5') +param containerCpuCoreCount string = '0.5' + +@description('Memory allocated to a single container instance, e.g. 1Gi') +param containerMemory string = '1Gi' + var abbrs = loadJsonContent('../../abbreviations.json') var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) var tags = { 'azd-env-name': environmentName } @@ -49,6 +55,10 @@ resource app 'Microsoft.App/containerApps@2022-03-01' = { image: imageName name: 'main' env: env + resources: { + cpu: json(containerCpuCoreCount) + memory: containerMemory + } } ] } diff --git a/templates/todo/common/infra/bicep/app/api-container-app.bicep b/templates/todo/common/infra/bicep/app/api-container-app.bicep index b68df26a83a..01fed01b75c 100644 --- a/templates/todo/common/infra/bicep/app/api-container-app.bicep +++ b/templates/todo/common/infra/bicep/app/api-container-app.bicep @@ -8,6 +8,12 @@ param imageName string = '' param keyVaultName string = '' param serviceName string = 'api' +@description('CPU cores allocated to a single container instance, e.g. 0.5') +param containerCpuCoreCount string = '0.5' + +@description('Memory allocated to a single container instance, e.g. 1Gi') +param containerMemory string = '1Gi' + var abbrs = loadJsonContent('../../../../../common/infra/bicep/abbreviations.json') var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) @@ -18,6 +24,8 @@ module api '../../../../../common/infra/bicep/core/host/container-app.bicep' = { location: location containerAppsEnvironmentName: containerAppsEnvironmentName containerRegistryName: containerRegistryName + containerCpuCoreCount: containerCpuCoreCount + containerMemory: containerMemory env: [ { name: 'AZURE_KEY_VAULT_ENDPOINT' diff --git a/templates/todo/common/infra/bicep/app/web-container-app.bicep b/templates/todo/common/infra/bicep/app/web-container-app.bicep index b72f6e4598b..29bf2ef5e0a 100644 --- a/templates/todo/common/infra/bicep/app/web-container-app.bicep +++ b/templates/todo/common/infra/bicep/app/web-container-app.bicep @@ -9,6 +9,12 @@ param imageName string = '' param keyVaultName string = '' param serviceName string = 'web' +@description('CPU cores allocated to a single container instance, e.g. 0.5') +param containerCpuCoreCount string = '0.5' + +@description('Memory allocated to a single container instance, e.g. 1Gi') +param containerMemory string = '1Gi' + var abbrs = loadJsonContent('../../../../../common/infra/bicep/abbreviations.json') var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) @@ -19,6 +25,8 @@ module web '../../../../../common/infra/bicep/core/host/container-app.bicep' = { location: location containerAppsEnvironmentName: containerAppsEnvironmentName containerRegistryName: containerRegistryName + containerCpuCoreCount: containerCpuCoreCount + containerMemory: containerMemory env: [ { name: 'REACT_APP_APPLICATIONINSIGHTS_CONNECTION_STRING' diff --git a/templates/todo/projects/java-mongo-aca/azure.yaml b/templates/todo/projects/java-mongo-aca/.repo/bicep/azure.yaml similarity index 100% rename from templates/todo/projects/java-mongo-aca/azure.yaml rename to templates/todo/projects/java-mongo-aca/.repo/bicep/azure.yaml diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.bicep b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.bicep new file mode 100644 index 00000000000..02e0c504abd --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.bicep @@ -0,0 +1,52 @@ +targetScope = 'subscription' + +@minLength(1) +@maxLength(64) +@description('Name of the the environment which is used to generate a short unique hash used in all resources.') +param environmentName string + +@minLength(1) +@description('Primary location for all resources') +param location string + +@description('Id of the user or app to assign application roles') +param principalId string = '' + +@description('The image name for the api service') +param apiImageName string = '' + +@description('The image name for the web service') +param webImageName string = '' + +var abbrs = loadJsonContent('../../../../../../common/infra/bicep/abbreviations.json') +var tags = { 'azd-env-name': environmentName } + +resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { + name: '${abbrs.resourcesResourceGroups}${environmentName}' + location: location + tags: tags +} + +module resources 'resources.bicep' = { + name: 'resources' + scope: rg + params: { + environmentName: environmentName + location: location + principalId: principalId + apiImageName: apiImageName + webImageName: webImageName + } +} + +output APPLICATIONINSIGHTS_CONNECTION_STRING string = resources.outputs.APPLICATIONINSIGHTS_CONNECTION_STRING +output AZURE_CONTAINER_REGISTRY_ENDPOINT string = resources.outputs.AZURE_CONTAINER_REGISTRY_ENDPOINT +output AZURE_CONTAINER_REGISTRY_NAME string = resources.outputs.AZURE_CONTAINER_REGISTRY_NAME +output AZURE_COSMOS_CONNECTION_STRING_KEY string = resources.outputs.AZURE_COSMOS_CONNECTION_STRING_KEY +output AZURE_COSMOS_DATABASE_NAME string = resources.outputs.AZURE_COSMOS_DATABASE_NAME +output AZURE_KEY_VAULT_ENDPOINT string = resources.outputs.AZURE_KEY_VAULT_ENDPOINT +output AZURE_LOCATION string = location +output AZURE_TENANT string = tenant().tenantId +output REACT_APP_API_BASE_URL string = resources.outputs.API_URI +output REACT_APP_APPLICATIONINSIGHTS_CONNECTION_STRING string = resources.outputs.APPLICATIONINSIGHTS_CONNECTION_STRING +output REACT_APP_WEB_BASE_URL string = resources.outputs.WEB_URI diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.parameters.json b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.parameters.json new file mode 100644 index 00000000000..d25cd8d8018 --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/main.parameters.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "environmentName": { + "value": "${AZURE_ENV_NAME}" + }, + "location": { + "value": "${AZURE_LOCATION}" + }, + "principalId": { + "value": "${AZURE_PRINCIPAL_ID}" + }, + "apiImageName": { + "value": "${SERVICE_API_IMAGE_NAME}" + }, + "webImageName": { + "value": "${SERVICE_WEB_IMAGE_NAME}" + } + } +} \ No newline at end of file diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep new file mode 100644 index 00000000000..1899e9a27b2 --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep @@ -0,0 +1,83 @@ +param environmentName string +param location string = resourceGroup().location +param principalId string = '' +param apiImageName string = '' +param webImageName string = '' + +// Container apps host (including container registry) +module containerApps '../../../../../../common/infra/bicep/core/host/container-apps.bicep' = { + name: 'container-apps' + params: { + environmentName: environmentName + location: location + logAnalyticsWorkspaceName: monitoring.outputs.logAnalyticsWorkspaceName + } +} + +// Web frontend +module web '../../../../../common/infra/bicep/app/web-container-app.bicep' = { + name: 'web' + params: { + environmentName: environmentName + location: location + imageName: webImageName + apiName: api.outputs.API_NAME + applicationInsightsName: monitoring.outputs.applicationInsightsName + containerAppsEnvironmentName: containerApps.outputs.containerAppsEnvironmentName + containerRegistryName: containerApps.outputs.containerRegistryName + } +} + +// Api backend +module api '../../../../../common/infra/bicep/app/api-container-app.bicep' = { + name: 'api' + params: { + environmentName: environmentName + location: location + imageName: apiImageName + applicationInsightsName: monitoring.outputs.applicationInsightsName + containerAppsEnvironmentName: containerApps.outputs.containerAppsEnvironmentName + containerRegistryName: containerApps.outputs.containerRegistryName + containerCpuCoreCount: '1' + containerMemory: '2.0Gi' + keyVaultName: keyVault.outputs.keyVaultName + } +} + +// Application database +module cosmos '../../../../../common/infra/bicep/app/cosmos-mongo-db.bicep' = { + name: 'cosmos' + params: { + environmentName: environmentName + location: location + keyVaultName: keyVault.outputs.keyVaultName + } +} + +// Store secrets in a keyvault +module keyVault '../../../../../../common/infra/bicep/core/security/keyvault.bicep' = { + name: 'keyvault' + params: { + environmentName: environmentName + location: location + principalId: principalId + } +} + +// Monitor application with Azure Monitor +module monitoring '../../../../../../common/infra/bicep/core/monitor/monitoring.bicep' = { + name: 'monitoring' + params: { + environmentName: environmentName + location: location + } +} + +output API_URI string = api.outputs.API_URI +output APPLICATIONINSIGHTS_CONNECTION_STRING string = monitoring.outputs.applicationInsightsConnectionString +output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerApps.outputs.containerRegistryEndpoint +output AZURE_CONTAINER_REGISTRY_NAME string = containerApps.outputs.containerRegistryName +output AZURE_COSMOS_CONNECTION_STRING_KEY string = cosmos.outputs.cosmosConnectionStringKey +output AZURE_COSMOS_DATABASE_NAME string = cosmos.outputs.cosmosDatabaseName +output AZURE_KEY_VAULT_ENDPOINT string = keyVault.outputs.keyVaultEndpoint +output WEB_URI string = web.outputs.WEB_URI diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml new file mode 100644 index 00000000000..6706dbffc91 --- /dev/null +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml @@ -0,0 +1,172 @@ +templateApi: 1.0.0 +metadata: + type: repo + name: todo-java-mongo-aca + description: ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure Container Apps + +repo: + includeProjectAssets: false + + remotes: + - name: azure-samples-main + url: git@github.com:Azure-Samples/todo-nodejs-mongo-aca.git + - name: azure-samples-staging + url: git@github.com:Azure-Samples/todo-nodejs-mongo-aca.git + branch: staging + + rewrite: + rules: + - from: ../../../../../../common/infra/bicep/core + to: ./core + patterns: + - "**/*.bicep" + + - from: ../../../../../common/infra/bicep/app + to: ./app + patterns: + - "**/*.bicep" + + - from: ../../../../../common/infra/bicep/core + to: ../core + patterns: + - "**/*.bicep" + + # app service modules + - from: ../../../../../../common/infra/bicep + to: ../ + patterns: + - "**/*.bicep" + ignore: + - "**/main.bicep" + + - from: ../../../../../common/infra/bicep + to: ../ + patterns: + - "**/*.bicep" + ignore: + - "**/main.bicep" + + # main.bicep + - from: ../../../../../../common/infra/bicep + to: ./ + patterns: + - "**/main.bicep" + + - from: ../../api/js + to: ./src/api + patterns: + - "**/azure.@(yml|yaml)" + + - from: ../../web/react-fluent + to: ./src/web + patterns: + - "**/azure.@(yml|yaml)" + + - from: web-container-app.bicep + to: web.bicep + patterns: + - "**/resources.bicep" + + - from: api-container-app.bicep + to: api.bicep + patterns: + - "**/resources.bicep" + + - from: cosmos-mongo-db.bicep + to: db.bicep + patterns: + - "**/resources.bicep" + + assets: + # # Common assets + + # Infra + - from: ./infra/ + to: ./infra + + - from: ../../../../../common/infra/bicep + to: ./infra + + - from: ../../../../common/infra/bicep/app/web-container-app.bicep + to: ./infra/app/web.bicep + + - from: ../../../../common/infra/bicep/app/api-container-app.bicep + to: ./infra/app/api.bicep + + - from: ../../../../common/infra/bicep/app/web-container-app.parameters.json + to: ./infra/app/web.parameters.json + + - from: ../../../../common/infra/bicep/app/api-container-app.parameters.json + to: ./infra/app/api.parameters.json + + - from: ../../../../common/infra/bicep/app/cosmos-mongo-db.bicep + to: ./infra/app/db.bicep + + - from: ./../../ + to: ./ + ignore: + - ".repo/**/*" + - "repo.y[a]ml" + - "azure.y[a]ml" + + # openapi.yaml to root + - from: ../../../../api/common + to: ./ + patterns: + - openapi.yaml + + # openapi.yaml to api root + - from: ../../../../api/common + to: ./src/api + patterns: + - openapi.yaml + + # Templates common + - from: ../../../../../common + to: ./ + ignore: + - .github/**/* + - .devcontainer/**/* + - "infra/**/*" + + # Github workflows for bicep + - from: ../../../../../common/.github/workflows/bicep + to: ./.github/workflows + + # azd core modules + - from: ../../../../../common/infra/bicep + to: ./infra + + # .devcontainer common (devcontainer.json) + - from: ../../../../../common/.devcontainer/devcontainer.json/java + to: ./.devcontainer + + # .devcontainer common (Dockerfile) + - from: ../../../../../common/.devcontainer/Dockerfile/base + to: ./.devcontainer + + # Assets common + - from: ../../../../common/assets + to: ./assets + + # Tests common + - from: ../../../../common/tests + to: ./tests + + # Java API + - from: ../../../../api/java + to: ./src/api + ignore: + - "target/**/*" + - "**/*.log" + + # React Frontend + - from: ../../../../web/react-fluent + to: ./src/web + ignore: + - "build/**/*" + - "node_modules/**/*" + + # Azure.yml + - from: ./azure.yaml + to: ./azure.yaml diff --git a/templates/todo/projects/java-mongo-aca/repo.yaml b/templates/todo/projects/java-mongo-aca/repo.yaml deleted file mode 100644 index 96071dcfd30..00000000000 --- a/templates/todo/projects/java-mongo-aca/repo.yaml +++ /dev/null @@ -1,96 +0,0 @@ -templateApi: 1.0.0 -metadata: - type: repo - name: todo-java-mongo-aca - description: ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure Container Apps - -repo: - includeProjectAssets: true - - remotes: - - name: azure-samples-main - url: git@github.com:Azure-Samples/todo-java-mongo-aca.git - - name: azure-samples-staging - url: git@github.com:Azure-Samples/todo-java-mongo-aca.git - branch: staging - - rewrite: - rules: - - from: ../../../../../common/infra/bicep - to: ./ - patterns: - - "**/*.bicep" - - - from: ../../api/js - to: ./src/api - patterns: - - "**/azure.@(yml|yaml)" - - - from: ../../web/react-fluent - to: ./src/web - patterns: - - "**/azure.@(yml|yaml)" - - - from: ../common/openapi.yaml - to: openapi.yaml - patterns: - - pom.xml - - assets: - # Common assets - - # openapi.yaml to root - - from: ../../api/common - to: ./ - patterns: - - openapi.yaml - - # openapi.yaml to api root - - from: ../../api/common - to: ./src/api - patterns: - - openapi.yaml - - # Templates common - - from: ../../../common - to: ./ - ignore: - - .devcontainer/**/* - - "infra/**/*" - - - from: ../../../common/infra/bicep - to: ./infra - - # .devcontainer common (devcontainer.json) - - from: ../../../common/.devcontainer/devcontainer.json/java - to: ./.devcontainer - - # .devcontainer common (Dockerfile) - - from: ../../../common/.devcontainer/Dockerfile/base - to: ./.devcontainer - - # Assets common - - from: ../../common/assets - to: ./assets - - # Tests common - - from: ../../common/tests - to: ./tests - - # ACA infra common - - from: ../../common/infra/aca/bicep - to: ./infra - - # Java API - - from: ../../api/java - to: ./src/api - ignore: - - "target/**/*" - - .env - - # React Frontend - - from: ../../web/react-fluent - to: ./src/web - ignore: - - "build/**/*" - - "node_modules/**/*" From 66c36039a2fbc0f97c89d093caefc7ef3e77efb3 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 19 Sep 2022 15:08:14 -0700 Subject: [PATCH 23/41] fix service bicep module path --- .../projects/java-mongo-aca/.repo/bicep/azure.yaml | 12 +++++++----- .../projects/java-mongo-aca/.repo/bicep/repo.yaml | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/azure.yaml b/templates/todo/projects/java-mongo-aca/.repo/bicep/azure.yaml index 01a061f819c..d3ddab6476f 100644 --- a/templates/todo/projects/java-mongo-aca/.repo/bicep/azure.yaml +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/azure.yaml @@ -4,11 +4,13 @@ name: todo-java-mongo-aca metadata: template: todo-java-mongo-aca@0.0.1-beta services: - api: - project: src/api - language: java - host: containerapp web: - project: src/web + project: ../../web/react-fluent + module: app/web language: js host: containerapp + api: + project: ../../api/java + module: app/api + language: java + host: containerapp diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml index 6706dbffc91..49a41bc461e 100644 --- a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml @@ -52,7 +52,7 @@ repo: patterns: - "**/main.bicep" - - from: ../../api/js + - from: ../../api/java to: ./src/api patterns: - "**/azure.@(yml|yaml)" From 31022b0fc1adda2f1b5912c7d95cab4191cbd374 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Tue, 20 Sep 2022 14:53:34 -0700 Subject: [PATCH 24/41] Bump CPU and memory --- .../common/infra/bicep/core/host/container-app.bicep | 2 +- .../common/infra/bicep/app/api-container-app.bicep | 10 ++-------- .../common/infra/bicep/app/web-container-app.bicep | 8 -------- .../java-mongo-aca/.repo/bicep/infra/resources.bicep | 2 -- 4 files changed, 3 insertions(+), 19 deletions(-) diff --git a/templates/common/infra/bicep/core/host/container-app.bicep b/templates/common/infra/bicep/core/host/container-app.bicep index 99d08717229..cc0751d1a33 100644 --- a/templates/common/infra/bicep/core/host/container-app.bicep +++ b/templates/common/infra/bicep/core/host/container-app.bicep @@ -15,7 +15,7 @@ param serviceName string param containerCpuCoreCount string = '0.5' @description('Memory allocated to a single container instance, e.g. 1Gi') -param containerMemory string = '1Gi' +param containerMemory string = '1.0Gi' var abbrs = loadJsonContent('../../abbreviations.json') var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) diff --git a/templates/todo/common/infra/bicep/app/api-container-app.bicep b/templates/todo/common/infra/bicep/app/api-container-app.bicep index 01fed01b75c..8cd77a3bc2c 100644 --- a/templates/todo/common/infra/bicep/app/api-container-app.bicep +++ b/templates/todo/common/infra/bicep/app/api-container-app.bicep @@ -8,12 +8,6 @@ param imageName string = '' param keyVaultName string = '' param serviceName string = 'api' -@description('CPU cores allocated to a single container instance, e.g. 0.5') -param containerCpuCoreCount string = '0.5' - -@description('Memory allocated to a single container instance, e.g. 1Gi') -param containerMemory string = '1Gi' - var abbrs = loadJsonContent('../../../../../common/infra/bicep/abbreviations.json') var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) @@ -24,8 +18,8 @@ module api '../../../../../common/infra/bicep/core/host/container-app.bicep' = { location: location containerAppsEnvironmentName: containerAppsEnvironmentName containerRegistryName: containerRegistryName - containerCpuCoreCount: containerCpuCoreCount - containerMemory: containerMemory + containerCpuCoreCount: '1.0' + containerMemory: '2.0Gi' env: [ { name: 'AZURE_KEY_VAULT_ENDPOINT' diff --git a/templates/todo/common/infra/bicep/app/web-container-app.bicep b/templates/todo/common/infra/bicep/app/web-container-app.bicep index 29bf2ef5e0a..b72f6e4598b 100644 --- a/templates/todo/common/infra/bicep/app/web-container-app.bicep +++ b/templates/todo/common/infra/bicep/app/web-container-app.bicep @@ -9,12 +9,6 @@ param imageName string = '' param keyVaultName string = '' param serviceName string = 'web' -@description('CPU cores allocated to a single container instance, e.g. 0.5') -param containerCpuCoreCount string = '0.5' - -@description('Memory allocated to a single container instance, e.g. 1Gi') -param containerMemory string = '1Gi' - var abbrs = loadJsonContent('../../../../../common/infra/bicep/abbreviations.json') var resourceToken = toLower(uniqueString(subscription().id, environmentName, location)) @@ -25,8 +19,6 @@ module web '../../../../../common/infra/bicep/core/host/container-app.bicep' = { location: location containerAppsEnvironmentName: containerAppsEnvironmentName containerRegistryName: containerRegistryName - containerCpuCoreCount: containerCpuCoreCount - containerMemory: containerMemory env: [ { name: 'REACT_APP_APPLICATIONINSIGHTS_CONNECTION_STRING' diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep index 1899e9a27b2..f46733256de 100644 --- a/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/infra/resources.bicep @@ -38,8 +38,6 @@ module api '../../../../../common/infra/bicep/app/api-container-app.bicep' = { applicationInsightsName: monitoring.outputs.applicationInsightsName containerAppsEnvironmentName: containerApps.outputs.containerAppsEnvironmentName containerRegistryName: containerApps.outputs.containerRegistryName - containerCpuCoreCount: '1' - containerMemory: '2.0Gi' keyVaultName: keyVault.outputs.keyVaultName } } From 807af99ff228a360f2a1b97df4d55ad103564c07 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Wed, 21 Sep 2022 11:38:39 -0700 Subject: [PATCH 25/41] Include proper packaging support --- .../pkg/project/framework_service_maven.go | 52 ++++++++++++++++++- cli/azd/pkg/tools/maven/maven.go | 4 +- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/cli/azd/pkg/project/framework_service_maven.go b/cli/azd/pkg/project/framework_service_maven.go index 98bafa34a85..b65b27ced07 100644 --- a/cli/azd/pkg/project/framework_service_maven.go +++ b/cli/azd/pkg/project/framework_service_maven.go @@ -2,15 +2,22 @@ package project import ( "context" + "fmt" + "os" "path/filepath" + "strings" "github.com/azure/azure-dev/cli/azd/pkg/environment" "github.com/azure/azure-dev/cli/azd/pkg/exec" "github.com/azure/azure-dev/cli/azd/pkg/tools" "github.com/azure/azure-dev/cli/azd/pkg/tools/javac" "github.com/azure/azure-dev/cli/azd/pkg/tools/maven" + "github.com/otiai10/copy" ) +// The default, conventional App Service Java package name +const AppServiceJavaPackageName = "app.jar" + type mavenProject struct { config *ServiceConfig env *environment.Environment @@ -26,12 +33,55 @@ func (m *mavenProject) RequiredExternalTools() []tools.ExternalTool { } func (m *mavenProject) Package(ctx context.Context, progress chan<- string) (string, error) { + publishRoot, err := os.MkdirTemp("", "azd") + if err != nil { + return "", fmt.Errorf("creating package directory for %s: %w", m.config.Name, err) + } + progress <- "Creating deployment package" if err := m.mavenCli.Package(ctx, m.config.Path()); err != nil { return "", err } - return filepath.Join(m.config.Path(), "target"), nil + publishSource := m.config.Path() + + if m.config.OutputPath != "" { + publishSource = filepath.Join(publishSource, m.config.OutputPath) + } else { + publishSource = filepath.Join(publishSource, "target") + } + + entries, err := os.ReadDir(publishSource) + if err != nil { + return "", fmt.Errorf("publishing for %s: %w", m.config.Name, err) + } + + matches := []string{} + for _, entry := range entries { + if entry.IsDir() { + continue + } + + name := entry.Name() + if strings.HasSuffix(name, ".jar") || strings.HasSuffix(name, ".war") || strings.HasSuffix(name, ".ear") { + matches = append(matches, name) + } + } + + if len(matches) == 0 { + return "", fmt.Errorf("could not find any .war/.ear/.jar files packaged in %s", publishSource) + } + if len(matches) > 1 { + names := strings.Join(matches, ", ") + return "", fmt.Errorf("multiple application .war/.ear/.jar files found in %s: %s", publishSource, names) + } + + err = copy.Copy(filepath.Join(publishSource, matches[0]), filepath.Join(publishRoot, AppServiceJavaPackageName)) + if err != nil { + return "", fmt.Errorf("publishing for %s: %w", m.config.Name, err) + } + + return publishRoot, nil } func (m *mavenProject) InstallDependencies(ctx context.Context) error { diff --git a/cli/azd/pkg/tools/maven/maven.go b/cli/azd/pkg/tools/maven/maven.go index 99f6d96cb2d..6aa6209f9eb 100644 --- a/cli/azd/pkg/tools/maven/maven.go +++ b/cli/azd/pkg/tools/maven/maven.go @@ -125,7 +125,9 @@ func (cli *mavenCli) Package(ctx context.Context, projectPath string) error { if err != nil { return err } - runArgs := exec.NewRunArgs(mvnCmd, "package").WithCwd(projectPath) + + // Maven's package phase includes tests by default. Skip it explicitly. + runArgs := exec.NewRunArgs(mvnCmd, "package", "-DskipTests").WithCwd(projectPath) res, err := cli.commandRunner.Run(ctx, runArgs) if err != nil { return fmt.Errorf("mvn package on project '%s' failed: %s: %w", projectPath, res.String(), err) From 0e93047ce06030872ea69581dcd2a02f1622bf55 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Wed, 21 Sep 2022 14:27:46 -0700 Subject: [PATCH 26/41] App service java changes --- .../bicep/core/host/appservice-java.bicep | 35 +++ .../infra/bicep/core/host/appservice.bicep | 1 + .../infra/bicep/app/api-appservice-java.bicep | 25 +++ .../java-mongo/.repo/bicep/azure.yaml | 15 ++ .../java-mongo/.repo/bicep/infra/main.bicep | 42 ++++ .../.repo/bicep/infra/main.parameters.json | 15 ++ .../.repo/bicep/infra/resources.bicep | 84 +++++++ .../projects/java-mongo/.repo/bicep/repo.yaml | 175 +++++++++++++++ .../projects/java-mongo/.vscode/launch.json | 35 +++ .../projects/java-mongo/.vscode/tasks.json | 90 ++++++++ templates/todo/projects/java-mongo/README.md | 211 ++++++++++++++++++ .../projects/java-mongo/assets/resources.png | Bin 0 -> 123324 bytes 12 files changed, 728 insertions(+) create mode 100644 templates/common/infra/bicep/core/host/appservice-java.bicep create mode 100644 templates/todo/common/infra/bicep/app/api-appservice-java.bicep create mode 100644 templates/todo/projects/java-mongo/.repo/bicep/azure.yaml create mode 100644 templates/todo/projects/java-mongo/.repo/bicep/infra/main.bicep create mode 100644 templates/todo/projects/java-mongo/.repo/bicep/infra/main.parameters.json create mode 100644 templates/todo/projects/java-mongo/.repo/bicep/infra/resources.bicep create mode 100644 templates/todo/projects/java-mongo/.repo/bicep/repo.yaml create mode 100644 templates/todo/projects/java-mongo/.vscode/launch.json create mode 100644 templates/todo/projects/java-mongo/.vscode/tasks.json create mode 100644 templates/todo/projects/java-mongo/README.md create mode 100644 templates/todo/projects/java-mongo/assets/resources.png diff --git a/templates/common/infra/bicep/core/host/appservice-java.bicep b/templates/common/infra/bicep/core/host/appservice-java.bicep new file mode 100644 index 00000000000..d3630dfef9f --- /dev/null +++ b/templates/common/infra/bicep/core/host/appservice-java.bicep @@ -0,0 +1,35 @@ +param environmentName string +param location string = resourceGroup().location + +param allowedOrigins array = [] +param appCommandLine string = '' +param applicationInsightsName string +param appServicePlanId string +param appSettings object = {} +param keyVaultName string = '' +param linuxFxVersion string = 'JAVA|17-java17' +param managedIdentity bool = !(empty(keyVaultName)) +param scmDoBuildDuringDeployment bool = true +param serviceName string + +module appService 'appservice.bicep' = { + name: '${serviceName}-appservice-java' + params: { + environmentName: environmentName + location: location + allowedOrigins: allowedOrigins + appCommandLine: appCommandLine + applicationInsightsName: applicationInsightsName + appServicePlanId: appServicePlanId + appSettings: appSettings + keyVaultName: keyVaultName + linuxFxVersion: linuxFxVersion + managedIdentity: managedIdentity + scmDoBuildDuringDeployment: scmDoBuildDuringDeployment + serviceName: serviceName + } +} + +output identityPrincipalId string = appService.outputs.identityPrincipalId +output name string = appService.outputs.name +output uri string = appService.outputs.uri diff --git a/templates/common/infra/bicep/core/host/appservice.bicep b/templates/common/infra/bicep/core/host/appservice.bicep index 224fca502c7..792ff085cb8 100644 --- a/templates/common/infra/bicep/core/host/appservice.bicep +++ b/templates/common/infra/bicep/core/host/appservice.bicep @@ -25,6 +25,7 @@ var resourceToken = toLower(uniqueString(subscription().id, environmentName, loc var prefix = contains(kind, 'function') ? abbrs.webSitesFunctions : abbrs.webSitesAppService + resource appService 'Microsoft.Web/sites@2022-03-01' = { name: '${prefix}${serviceName}-${resourceToken}' location: location diff --git a/templates/todo/common/infra/bicep/app/api-appservice-java.bicep b/templates/todo/common/infra/bicep/app/api-appservice-java.bicep new file mode 100644 index 00000000000..dff0d97f770 --- /dev/null +++ b/templates/todo/common/infra/bicep/app/api-appservice-java.bicep @@ -0,0 +1,25 @@ +param environmentName string +param location string = resourceGroup().location + +param allowedOrigins array = [] +param applicationInsightsName string +param appServicePlanId string +param keyVaultName string +param serviceName string = 'api' + +module api '../../../../../common/infra/bicep/core/host/appservice-java.bicep' = { + name: '${serviceName}-appservice-java-module' + params: { + environmentName: environmentName + location: location + allowedOrigins: allowedOrigins + applicationInsightsName: applicationInsightsName + appServicePlanId: appServicePlanId + keyVaultName: keyVaultName + serviceName: serviceName + } +} + +output API_IDENTITY_PRINCIPAL_ID string = api.outputs.identityPrincipalId +output API_NAME string = api.outputs.name +output API_URI string = api.outputs.uri diff --git a/templates/todo/projects/java-mongo/.repo/bicep/azure.yaml b/templates/todo/projects/java-mongo/.repo/bicep/azure.yaml new file mode 100644 index 00000000000..ba47ec2ad91 --- /dev/null +++ b/templates/todo/projects/java-mongo/.repo/bicep/azure.yaml @@ -0,0 +1,15 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json + +name: todo-java-mongo +metadata: + template: todo-java-mongo@0.0.1-beta +services: + web: + project: ../../web/react-fluent + dist: build + language: js + host: appservice + api: + project: ../../api/java + language: java + host: appservice diff --git a/templates/todo/projects/java-mongo/.repo/bicep/infra/main.bicep b/templates/todo/projects/java-mongo/.repo/bicep/infra/main.bicep new file mode 100644 index 00000000000..b010ed8d985 --- /dev/null +++ b/templates/todo/projects/java-mongo/.repo/bicep/infra/main.bicep @@ -0,0 +1,42 @@ +targetScope = 'subscription' + +@minLength(1) +@maxLength(64) +@description('Name of the the environment which is used to generate a short unique hash used in all resources.') +param environmentName string + +@minLength(1) +@description('Primary location for all resources') +param location string + +@description('Id of the user or app to assign application roles') +param principalId string = '' + +var abbrs = loadJsonContent('../../../../../../common/infra/bicep/abbreviations.json') +var tags = { 'azd-env-name': environmentName } + +resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = { + name: '${abbrs.resourcesResourceGroups}${environmentName}' + location: location + tags: tags +} + +module resources 'resources.bicep' = { + name: 'resources' + scope: rg + params: { + environmentName: environmentName + location: location + principalId: principalId + } +} + +output APPLICATIONINSIGHTS_CONNECTION_STRING string = resources.outputs.APPLICATIONINSIGHTS_CONNECTION_STRING +output AZURE_COSMOS_CONNECTION_STRING_KEY string = resources.outputs.AZURE_COSMOS_CONNECTION_STRING_KEY +output AZURE_COSMOS_DATABASE_NAME string = resources.outputs.AZURE_COSMOS_DATABASE_NAME +output AZURE_KEY_VAULT_ENDPOINT string = resources.outputs.AZURE_KEY_VAULT_ENDPOINT +output AZURE_LOCATION string = location +output AZURE_TENANT string = tenant().tenantId +output REACT_APP_API_BASE_URL string = resources.outputs.API_URI +output REACT_APP_APPLICATIONINSIGHTS_CONNECTION_STRING string = resources.outputs.APPLICATIONINSIGHTS_CONNECTION_STRING +output REACT_APP_WEB_BASE_URL string = resources.outputs.WEB_URI diff --git a/templates/todo/projects/java-mongo/.repo/bicep/infra/main.parameters.json b/templates/todo/projects/java-mongo/.repo/bicep/infra/main.parameters.json new file mode 100644 index 00000000000..67ad8524c44 --- /dev/null +++ b/templates/todo/projects/java-mongo/.repo/bicep/infra/main.parameters.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "environmentName": { + "value": "${AZURE_ENV_NAME}" + }, + "location": { + "value": "${AZURE_LOCATION}" + }, + "principalId": { + "value": "${AZURE_PRINCIPAL_ID}" + } + } +} \ No newline at end of file diff --git a/templates/todo/projects/java-mongo/.repo/bicep/infra/resources.bicep b/templates/todo/projects/java-mongo/.repo/bicep/infra/resources.bicep new file mode 100644 index 00000000000..612dd6ecb7c --- /dev/null +++ b/templates/todo/projects/java-mongo/.repo/bicep/infra/resources.bicep @@ -0,0 +1,84 @@ +param environmentName string +param location string = resourceGroup().location +param principalId string = '' + +// The application frontend +module web '../../../../../common/infra/bicep/app/web-appservice.bicep' = { + name: 'web' + params: { + environmentName: environmentName + location: location + applicationInsightsName: monitoring.outputs.applicationInsightsName + appServicePlanId: appServicePlan.outputs.appServicePlanId + } +} + +// The application backend +module api '../../../../../common/infra/bicep/app/api-appservice-java.bicep' = { + name: 'api' + params: { + environmentName: environmentName + location: location + applicationInsightsName: monitoring.outputs.applicationInsightsName + appServicePlanId: appServicePlan.outputs.appServicePlanId + keyVaultName: keyVault.outputs.keyVaultName + allowedOrigins: [ web.outputs.WEB_URI ] + } +} + +// The application database +module cosmos '../../../../../common/infra/bicep/app/cosmos-mongo-db.bicep' = { + name: 'cosmos' + params: { + environmentName: environmentName + location: location + keyVaultName: keyVault.outputs.keyVaultName + } +} + +// Configure api to use cosmos +module apiCosmosConfig '../../../../../../common/infra/bicep/core/host/appservice-config-cosmos.bicep' = { + name: 'api-cosmos-config' + params: { + appServiceName: api.outputs.API_NAME + cosmosDatabaseName: cosmos.outputs.cosmosDatabaseName + cosmosConnectionStringKey: cosmos.outputs.cosmosConnectionStringKey + cosmosEndpoint: cosmos.outputs.cosmosEndpoint + } +} + +// Create an App Service Plan to group applications under the same payment plan and SKU +module appServicePlan '../../../../../../common/infra/bicep/core/host/appserviceplan-sites.bicep' = { + name: 'appserviceplan' + params: { + environmentName: environmentName + location: location + } +} + +// Store secrets in a keyvault +module keyVault '../../../../../../common/infra/bicep/core/security/keyvault.bicep' = { + name: 'keyvault' + params: { + environmentName: environmentName + location: location + principalId: principalId + } +} + +// Monitor application with Azure Monitor +module monitoring '../../../../../../common/infra/bicep/core/monitor/monitoring.bicep' = { + name: 'monitoring' + params: { + environmentName: environmentName + location: location + } +} + +output API_URI string = api.outputs.API_URI +output APPLICATIONINSIGHTS_CONNECTION_STRING string = monitoring.outputs.applicationInsightsConnectionString +output AZURE_COSMOS_CONNECTION_STRING_KEY string = cosmos.outputs.cosmosConnectionStringKey +output AZURE_COSMOS_DATABASE_NAME string = cosmos.outputs.cosmosDatabaseName +output AZURE_COSMOS_ENDPOINT string = cosmos.outputs.cosmosEndpoint +output AZURE_KEY_VAULT_ENDPOINT string = keyVault.outputs.keyVaultEndpoint +output WEB_URI string = web.outputs.WEB_URI diff --git a/templates/todo/projects/java-mongo/.repo/bicep/repo.yaml b/templates/todo/projects/java-mongo/.repo/bicep/repo.yaml new file mode 100644 index 00000000000..aebad8fe792 --- /dev/null +++ b/templates/todo/projects/java-mongo/.repo/bicep/repo.yaml @@ -0,0 +1,175 @@ +templateApi: 1.0.0 +metadata: + type: repo + name: todo-java-mongo + description: ToDo Application with a Java API and Azure Cosmos DB API for MongoDB + +repo: + includeProjectAssets: false + + remotes: + - name: azure-samples-main + url: git@github.com:Azure-Samples/todo-java-mongo.git + - name: azure-samples-staging + url: git@github.com:Azure-Samples/todo-java-mongo.git + branch: staging + + rewrite: + rules: + - from: ../../../../../../common/infra/bicep/core + to: ./core + patterns: + - "**/*.bicep" + + - from: ../../../../../common/infra/bicep/app + to: ./app + patterns: + - "**/*.bicep" + + - from: ../../../../../common/infra/bicep/core + to: ../core + patterns: + - "**/*.bicep" + + # app service modules + - from: ../../../../../../common/infra/bicep + to: ../ + patterns: + - "**/*.bicep" + ignore: + - "**/main.bicep" + + # main.bicep + - from: ../../../../../../common/infra/bicep + to: ./ + patterns: + - "**/main.bicep" + + - from: ../../api/java + to: ./src/api + patterns: + - "**/azure.@(yml|yaml)" + + - from: ../../web/react-fluent + to: ./src/web + patterns: + - "**/azure.@(yml|yaml)" + + - from: web-appservice.bicep + to: web.bicep + patterns: + - "**/resources.bicep" + + - from: api-appservice-java.bicep + to: api.bicep + patterns: + - "**/resources.bicep" + + - from: cosmos-mongo-db.bicep + to: db.bicep + patterns: + - "**/resources.bicep" + + - from: "PLACEHOLDERIACTOOLS" + to: "" + patterns: + - "README.md" + + - from: "PLACEHOLDER_TITLE" + to: "ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure App Service" + patterns: + - "README.md" + + - from: "PLACEHOLDER_DESCRIPTION" + to: "using Bicep as the IaC provider" + patterns: + - "README.md" + + assets: + # Common assets + + # Infra + - from: ./infra/ + to: ./infra + + - from: ../../../../common/infra/bicep/app/web-appservice.bicep + to: ./infra/app/web.bicep + + - from: ../../../../common/infra/bicep/app/api-appservice-java.bicep + to: ./infra/app/api.bicep + + - from: ../../../../common/infra/bicep/app/cosmos-mongo-db.bicep + to: ./infra/app/db.bicep + + - from: ./../../ + to: ./ + ignore: + - ".repo/**/*" + - "repo.y[a]ml" + - "azure.y[a]ml" + + # openapi.yaml to root + - from: ../../../../api/common + to: ./ + patterns: + - openapi.yaml + + # openapi.yaml to api root + - from: ../../../../api/common + to: ./src/api + patterns: + - openapi.yaml + + # Templates common + - from: ../../../../../common + to: ./ + ignore: + - .github/**/* + - .devcontainer/**/* + - "infra/**/*" + + # Github workflows for bicep + - from: ../../../../../common/.github/workflows/bicep + to: ./.github/workflows + + # azd core modules + - from: ../../../../../common/infra/bicep + to: ./infra + + # .devcontainer common (devcontainer.json) + - from: ../../../../../common/.devcontainer/devcontainer.json/java + to: ./.devcontainer + + # .devcontainer common (Dockerfile) + - from: ../../../../../common/.devcontainer/Dockerfile/base + to: ./.devcontainer + + # Assets common + - from: ../../../../common/assets + to: ./assets + + # Tests common + - from: ../../../../common/tests + to: ./tests + + # Java API + - from: ../../../../api/java + to: ./src/api + ignore: + - "target/**/*" + - "**/*.log" + + # React Frontend + - from: ../../../../web/react-fluent + to: ./src/web + ignore: + - "build/**/*" + - "node_modules/**/*" + + # Infra + - from: ./infra/ + to: ./infra + + # Azure.yml + - from: ./azure.yaml + to: ./azure.yaml diff --git a/templates/todo/projects/java-mongo/.vscode/launch.json b/templates/todo/projects/java-mongo/.vscode/launch.json new file mode 100644 index 00000000000..8140ef611fc --- /dev/null +++ b/templates/todo/projects/java-mongo/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Web", + "request": "launch", + "type": "msedge", + "webRoot": "${workspaceFolder}/src/web/src", + "url": "http://localhost:3000", + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + }, + }, + + { + "name": "Debug API", + "type": "java", + "request": "launch", + "preLaunchTask": "Build API", + "mainClass": "com.microsoft.azure.simpletodo.SimpleTodoApplication", + "args": [], + "cwd": "${workspaceFolder}/src/api", + "env": {}, + "envFile": "${input:dotEnvFilePath}" + } + ], + + "inputs": [ + { + "id": "dotEnvFilePath", + "type": "command", + "command": "azure-dev.commands.getDotEnvFilePath" + } + ] +} diff --git a/templates/todo/projects/java-mongo/.vscode/tasks.json b/templates/todo/projects/java-mongo/.vscode/tasks.json new file mode 100644 index 00000000000..59de83bc45c --- /dev/null +++ b/templates/todo/projects/java-mongo/.vscode/tasks.json @@ -0,0 +1,90 @@ +{ + "version": "2.0.0", + "tasks": [ + + { + "label": "Start API", + "type": "dotenv", + "targetTasks": "API mvn spring-boot:run", + "file": "${input:dotEnvFilePath}" + }, + { + "label": "API mvn spring-boot:run", + "detail": "Helper task--use 'Start API' task to ensure environment is set up correctly", + "type": "shell", + "command": "./mvnw spring-boot:run", + "options": { + "cwd": "${workspaceFolder}/src/api/" + }, + "presentation": { + "panel": "dedicated", + }, + "problemMatcher": [] + }, + { + "label": "Build API", + "command": "./mvnw", + "type": "shell", + "options": { + "cwd": "${workspaceFolder}/src/api/" + }, + "args": [ + "package", + "-DskipTests" + ], + "problemMatcher": [] + }, + { + "label": "Start Web", + "type": "dotenv", + "targetTasks": [ + "Restore Web", + "Web npm start" + ], + "file": "${input:dotEnvFilePath}" + }, + { + "label": "Restore Web", + "type": "shell", + "command": "azd restore --service web", + "presentation": { + "reveal": "silent" + }, + "problemMatcher": [] + }, + { + "label": "Web npm start", + "detail": "Helper task--use 'Start Web' task to ensure environment is set up correctly", + "type": "shell", + "command": "npm run start", + "options": { + "cwd": "${workspaceFolder}/src/web/", + "env": { + "REACT_APP_API_BASE_URL": "http://localhost:3100", + "BROWSER": "none" + } + }, + "presentation": { + "panel": "dedicated", + }, + "problemMatcher": [] + }, + + { + "label": "Start API and Web", + "dependsOn":[ + "Start API", + "Start Web" + ], + "problemMatcher": [] + } + ], + + "inputs": [ + { + "id": "dotEnvFilePath", + "type": "command", + "command": "azure-dev.commands.getDotEnvFilePath" + } + ] +} diff --git a/templates/todo/projects/java-mongo/README.md b/templates/todo/projects/java-mongo/README.md new file mode 100644 index 00000000000..76f8011c4d7 --- /dev/null +++ b/templates/todo/projects/java-mongo/README.md @@ -0,0 +1,211 @@ +# PLACEHOLDER_TITLE + +[![Open in Remote - Containers](https://img.shields.io/static/v1?label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/todo-nodejs-mongo) + +A complete ToDo application that includes everything you need to build, deploy, and monitor an Azure solution. This application uses the Azure Developer CLI (azd) to get you up and running on Azure quickly PLACEHOLDER_DESCRIPTION, React.js for the Web application, Java for the API, Azure Cosmos DB API for MongoDB for storage, and Azure Monitor for monitoring and logging. It includes application code, tools, and pipelines that serve as a foundation from which you can build upon and customize when creating your own solutions. + +Let's jump in and get the ToDo app up and running in Azure. When you are finished, you will have a fully functional web app deployed on Azure. In later steps, you'll see how to setup a pipeline and monitor the application. + +Screenshot of deployed ToDo app + +Screenshot of the deployed ToDo app + +### Prerequisites + +The following prerequisites are required to use this application. Please ensure that you have them all installed locally. + +- [Azure Developer CLI](https://aka.ms/azure-dev/install) + - Windows: + ```powershell + powershell -ex AllSigned -c "Invoke-RestMethod 'https://aka.ms/install-azd.ps1' | Invoke-Expression" + ``` + - Linux/MacOS: + ``` + curl -fsSL https://aka.ms/install-azd.sh | bash + ``` +- [Azure CLI (2.38.0+)](https://docs.microsoft.com/cli/azure/install-azure-cli) +- [Java 17 or later](https://jdk.java.net/) - for API backend +- [Node.js with npm (16.13.1+)](https://nodejs.org/) - for Web frontend +- [Git (2.36.1+)](https://git-scm.com/) +PLACEHOLDERIACTOOLS + +### Quickstart + +The fastest way for you to get this application up and running on Azure is to use the `azd up` command. This single command will create and configure all necessary Azure resources - including access policies and roles for your account and service-to-service communication with Managed Identities. + +1. Open a terminal, create a new empty folder, and change into it. +1. Run the following command to initialize the project, provision Azure resources, and deploy the application code. + +```bash +azd up --template todo-java-mongo +``` + +You will be prompted for the following information: + +- `Environment Name`: This will be used as a prefix for the resource group that will be created to hold all Azure resources. This name should be unique within your Azure subscription. +- `Azure Location`: The Azure location where your resources will be deployed. +- `Azure Subscription`: The Azure Subscription where your resources will be deployed. + +> NOTE: This may take a while to complete as it executes three commands: `azd init` (initializes environment), `azd provision` (provisions Azure resources), and `azd deploy` (deploys application code). You will see a progress indicator as it provisions and deploys your application. + +When `azd up` is complete it will output the following URLs: + +- Azure Portal link to view resources +- ToDo Web application frontend +- ToDo API application + +!["azd up output"](assets/urls.png) + +Click the web application URL to launch the ToDo app. Create a new collection and add some items. This will create monitoring activity in the application that you will be able to see later when you run `azd monitor`. + +> NOTE: +> +> - The `azd up` command will create Azure resources that will incur costs to your Azure subscription. You can clean up those resources manually via the Azure portal or with the `azd down` command. +> - You can call `azd up` as many times as you like to both provision and deploy your solution, but you only need to provide the `--template` parameter the first time you call it to get the code locally. Subsequent `azd up` calls do not require the template parameter. If you do provide the parameter, all your local source code will be overwritten if you agree to overwrite when prompted. +> - You can always create a new environment with `azd env new`. + +### Application Architecture + +This application utilizes the following Azure resources: + +- [**Azure App Services**](https://docs.microsoft.com/azure/app-service/) to host the Web frontend and API backend +- [**Azure Cosmos DB API for MongoDB**](https://docs.microsoft.com/azure/cosmos-db/mongodb/mongodb-introduction) for storage +- [**Azure Monitor**](https://docs.microsoft.com/azure/azure-monitor/) for monitoring and logging +- [**Azure Key Vault**](https://docs.microsoft.com/azure/key-vault/) for securing secrets + +Here's a high level architecture diagram that illustrates these components. Notice that these are all contained within a single [resource group](https://docs.microsoft.com/azure/azure-resource-manager/management/manage-resource-groups-portal), that will be created for you when you create the resources. + +Application architecture diagram + +> This template provisions resources to an Azure subscription that you will select upon provisioning them. Please refer to the [Pricing calculator for Microsoft Azure](https://azure.microsoft.com/pricing/calculator/) and, if needed, update the included Azure resource definitions found in `infra/main.bicep` to suit your needs. + +### Application Code + +The repo is structured to follow the [Azure Developer CLI](https://aka.ms/azure-dev/overview) conventions including: + +- **Source Code**: All application source code is located in the `src` folder. +- **Infrastructure as Code**: All application "infrastructure as code" files are located in the `infra` folder. +- **Azure Developer Configuration**: An `azure.yaml` file located in the root that ties the application source code to the Azure services defined in your "infrastructure as code" files. +- **GitHub Actions**: A sample GitHub action file is located in the `.github/workflows` folder. +- **VS Code Configuration**: All VS Code configuration to run and debug the application is located in the `.vscode` folder. + +### Azure Subscription + +This template will create infrastructure and deploy code to Azure. If you don't have an Azure Subscription, you can sign up for a [free account here](https://azure.microsoft.com/free/). + +### Azure Developer CLI - VS Code Extension + +The Azure Developer experience includes an Azure Developer CLI VS Code Extension that mirrors all of the Azure Developer CLI commands into the `azure.yaml` context menu and command palette options. If you are a VS Code user, then we highly recommend installing this extension for the best experience. + +Here's how to install it: + +#### VS Code + +1. Click on the "Extensions" tab in VS Code +1. Search for "Azure Developer CLI" - authored by Microsoft +1. Click "Install" + +#### Marketplace + +1. Go to the [Azure Developer CLI - VS Code Extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.azure-dev) page +1. Click "Install" + +Once the extension is installed, you can press `F1`, and type "Azure Developer CLI" to see all of your available options. You can also right click on your project's `azure.yaml` file for a list of commands. + +### Next Steps + +At this point, you have a complete application deployed on Azure. But there is much more that the Azure Developer CLI can do. These next steps will introduce you to additional commands that will make creating applications on Azure much easier. Using the Azure Developer CLI, you can setup your pipelines, monitor your application, test and debug locally. + +#### Set up a pipeline using `azd pipeline` + +This template includes a GitHub Actions pipeline configuration file that will deploy your application whenever code is pushed to the main branch. You can find that pipeline file here: `.github/workflows`. + +Setting up this pipeline requires you to give GitHub permission to deploy to Azure on your behalf, which is done via a Service Principal stored in a GitHub secret named `AZURE_CREDENTIALS`. The `azd pipeline config` command will automatically create a service principal for you. The command also helps to create a private GitHub repository and pushes code to the newly created repo. + +Before you call the `azd pipeline config` command, you'll need to install the following: + +- [GitHub CLI (2.3+)](https://github.com/cli/cli) + +Run the following command to set up a GitHub Action: + +```bash +azd pipeline config +``` + +> Support for Azure DevOps Pipelines is coming soon to `azd pipeline config`. In the meantime, you can follow the instructions found here: [.azdo/pipelines/README.md](./.azdo/pipelines/README.md) to set it up manually. + +#### Monitor the application using `azd monitor` + +To help with monitoring applications, the Azure Dev CLI provides a `monitor` command to help you get to the various Application Insights dashboards. + +- Run the following command to open the "Overview" dashboard: + + ```bash + azd monitor --overview + ``` + +- Live Metrics Dashboard + + Run the following command to open the "Live Metrics" dashboard: + + ```bash + azd monitor --live + ``` + +- Logs Dashboard + + Run the following command to open the "Logs" dashboard: + + ```bash + azd monitor --logs + ``` + +#### Run and Debug Locally + +The easiest way to run and debug is to leverage the Azure Developer CLI Visual Studio Code Extension. Refer to this [walk-through](https://aka.ms/azure-dev/vscode) for more details. + +#### Clean up resources + +When you are done, you can delete all the Azure resources created with this template by running the following command: + +```bash +azd down +``` + +### Additional azd commands + +The Azure Developer CLI includes many other commands to help with your Azure development experience. You can view these commands at the terminal by running `azd help`. You can also view the full list of commands on our [Azure Developer CLI command](https://aka.ms/azure-dev/ref) page. + +## Troubleshooting/Known issues + +Sometimes, things go awry. If you happen to run into issues, then please review our ["Known Issues"](https://aka.ms/azure-dev/knownissues) page for help. If you continue to have issues, then please file an issue in our main [Azure Dev](https://aka.ms/azure-dev/issues) repository. + +## Security + +### Roles + +This template creates a [managed identity](https://docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/overview) for your app inside your Azure Active Directory tenant, and it is used to authenticate your app with Azure and other services that support Azure AD authentication like Key Vault via access policies. You will see principalId referenced in the infrastructure as code files, that refers to the id of the currently logged in Azure CLI user, which will be granted access policies and permissions to run the application locally. To view your managed identity in the Azure Portal, follow these [steps](https://docs.microsoft.com/azure/active-directory/managed-identities-azure-resources/how-to-view-managed-identity-service-principal-portal). + +### Key Vault + +This template uses [Azure Key Vault](https://docs.microsoft.com/azure/key-vault/general/overview) to securely store your Cosmos DB connection string for the provisioned Cosmos DB account. Key Vault is a cloud service for securely storing and accessing secrets (API keys, passwords, certificates, cryptographic keys) and makes it simple to give other Azure services access to them. As you continue developing your solution, you may add as many secrets to your Key Vault as you require. + +## Uninstall + +To uninstall the Azure Developer CLI: + +Windows: + +``` +powershell -ex AllSigned -c "Invoke-RestMethod 'https://aka.ms/uninstall-azd.ps1' | Invoke-Expression" +``` + +Linux/MacOS: + +``` +curl -fsSL https://aka.ms/uninstall-azd.sh | bash +``` + +## Reporting Issues and Feedback + +If you have any feature requests, issues, or areas for improvement, please [file an issue](https://aka.ms/azure-dev/issues). To keep up-to-date, ask questions, or share suggestions, join our [GitHub Discussions](https://aka.ms/azure-dev/discussions). You may also contact us via AzDevTeam@microsoft.com. diff --git a/templates/todo/projects/java-mongo/assets/resources.png b/templates/todo/projects/java-mongo/assets/resources.png new file mode 100644 index 0000000000000000000000000000000000000000..07f06cb01a671f5a3db821b615a8e65e9c52626c GIT binary patch literal 123324 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 z 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 literal 0 HcmV?d00001 From 680e42f16db2789312a5f2c6bc1ee94a16bef93d Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Wed, 21 Sep 2022 18:04:49 -0700 Subject: [PATCH 27/41] update template --- templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml index 49a41bc461e..803fda53718 100644 --- a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml @@ -9,9 +9,9 @@ repo: remotes: - name: azure-samples-main - url: git@github.com:Azure-Samples/todo-nodejs-mongo-aca.git + url: git@github.com:Azure-Samples/todo-java-mongo-aca.git - name: azure-samples-staging - url: git@github.com:Azure-Samples/todo-nodejs-mongo-aca.git + url: git@github.com:Azure-Samples/todo-java-mongo-aca.git branch: staging rewrite: From 8653b522b484b407a7d37fec8c4ac2b1692db76a Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Fri, 23 Sep 2022 10:20:45 -0700 Subject: [PATCH 28/41] Fix pagination and send body in Create methods --- .../repository/TodoItemRepository.java | 24 +++++++++++---- .../repository/TodoListRepository.java | 9 ++++++ .../simpletodo/web/TodoListsController.java | 29 ++++++++----------- 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java index 4efca334a40..b32b1320832 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoItemRepository.java @@ -1,17 +1,29 @@ package com.microsoft.azure.simpletodo.repository; -import com.microsoft.azure.simpletodo.model.TodoItem; -import org.springframework.data.domain.Pageable; +import java.util.List; + +import org.springframework.data.mongodb.repository.Aggregation; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.mongodb.repository.Query; -import java.util.List; +import com.microsoft.azure.simpletodo.model.TodoItem; public interface TodoItemRepository extends MongoRepository { @Query("{ 'listId' : ?0 }") - List findTodoItemsByTodoList(String listId, Pageable pageable); + List findTodoItemsByTodoList(String listId); + + @Aggregation(pipeline = { + "{ '$match': { 'listId' : ?0 } }", + "{ '$skip': ?1 }", + "{ '$limit': ?2 }", + }) + List findTodoItemsByTodoList(String listId, int skip, int limit); - @Query("{ 'listId' : ?0, 'state' : ?1 }") - List findTodoItemsByTodoListAndState(String listId, String state, Pageable pageable); + @Aggregation(pipeline = { + "{ '$match': { 'listId' : ?0, 'state' : ?1 } }", + "{ '$skip': ?2 }", + "{ '$limit': ?3 }", + }) + List findTodoItemsByTodoListAndState(String listId, String state, int skip, int limit); } diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java index dc0201072c0..5b9a7202ebb 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/repository/TodoListRepository.java @@ -1,7 +1,16 @@ package com.microsoft.azure.simpletodo.repository; import com.microsoft.azure.simpletodo.model.TodoList; + +import java.util.List; + +import org.springframework.data.mongodb.repository.Aggregation; import org.springframework.data.mongodb.repository.MongoRepository; public interface TodoListRepository extends MongoRepository { + @Aggregation(pipeline = { + "{ '$skip': ?0 }", + "{ '$limit': ?1 }", + }) + List findAll(int skip, int limit); } diff --git a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java index b38963d7df9..b4f2e10a69b 100644 --- a/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java +++ b/templates/todo/api/java/src/main/java/com/microsoft/azure/simpletodo/web/TodoListsController.java @@ -7,7 +7,6 @@ import com.microsoft.azure.simpletodo.repository.TodoItemRepository; import com.microsoft.azure.simpletodo.repository.TodoListRepository; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -41,7 +40,7 @@ public ResponseEntity createItem(String listId, TodoItem todoItem) { .path("/{id}") .buildAndExpand(savedTodoItem.getId()) .toUri(); - return ResponseEntity.created(location).build(); + return ResponseEntity.created(location).body(savedTodoItem); } else { return ResponseEntity.notFound().build(); } @@ -49,17 +48,13 @@ public ResponseEntity createItem(String listId, TodoItem todoItem) { @Override public ResponseEntity createList(TodoList todoList) { - try { - TodoList savedTodoList = todoListRepository.save(todoList); - URI location = ServletUriComponentsBuilder - .fromCurrentRequest() - .path("/{id}") - .buildAndExpand(savedTodoList.getId()) - .toUri(); - return ResponseEntity.created(location).build(); - } catch (Exception e) { - return ResponseEntity.badRequest().build(); - } + TodoList savedTodoList = todoListRepository.save(todoList); + URI location = ServletUriComponentsBuilder + .fromCurrentRequest() + .path("/{id}") + .buildAndExpand(savedTodoList.getId()) + .toUri(); + return ResponseEntity.created(location).body(savedTodoList); } @Override @@ -99,7 +94,7 @@ public ResponseEntity> getItemsByListId(String listId, BigDecimal } Optional todoList = todoListRepository.findById(listId); if (todoList.isPresent()) { - return ResponseEntity.ok(todoItemRepository.findTodoItemsByTodoList(listId, PageRequest.of(skip.multiply(top).intValue(), top.intValue()))); + return ResponseEntity.ok(todoItemRepository.findTodoItemsByTodoList(listId, skip.intValue(), top.intValue())); } else { return ResponseEntity.notFound().build(); } @@ -115,7 +110,7 @@ public ResponseEntity> getItemsByListIdAndState(String listId, To } return ResponseEntity.ok( todoItemRepository - .findTodoItemsByTodoListAndState(listId, state.name(), PageRequest.of(skip.multiply(top).intValue(), top.intValue()))); + .findTodoItemsByTodoListAndState(listId, state.name(), skip.intValue(), top.intValue())); } @Override @@ -131,7 +126,7 @@ public ResponseEntity> getLists(BigDecimal top, BigDecimal skip) if (skip == null) { skip = new BigDecimal(0); } - return ResponseEntity.ok(todoListRepository.findAll(PageRequest.of(skip.multiply(top).intValue(), top.intValue())).toList()); + return ResponseEntity.ok(todoListRepository.findAll(skip.intValue(), top.intValue())); } @Override @@ -144,7 +139,7 @@ public ResponseEntity updateItemById(String listId, String itemId, Tod @Override public ResponseEntity updateItemsStateByListId(String listId, TodoState state, List requestBody) { - for (TodoItem todoItem : todoItemRepository.findTodoItemsByTodoList(listId, Pageable.unpaged())) { + for (TodoItem todoItem : todoItemRepository.findTodoItemsByTodoList(listId)) { todoItem.state(state); todoItemRepository.save(todoItem); } From d4eb0d4d45fba1ff1447fe1f6033ed112d9bff4a Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Thu, 29 Sep 2022 08:51:32 -0700 Subject: [PATCH 29/41] remove extra newline --- templates/common/infra/bicep/core/host/appservice.bicep | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/common/infra/bicep/core/host/appservice.bicep b/templates/common/infra/bicep/core/host/appservice.bicep index 6089392a983..3eece634abf 100644 --- a/templates/common/infra/bicep/core/host/appservice.bicep +++ b/templates/common/infra/bicep/core/host/appservice.bicep @@ -25,7 +25,6 @@ var resourceToken = toLower(uniqueString(subscription().id, environmentName, loc var prefix = contains(kind, 'function') ? abbrs.webSitesFunctions : abbrs.webSitesAppService - resource appService 'Microsoft.Web/sites@2022-03-01' = { name: '${prefix}${serviceName}-${resourceToken}' location: location From 49269f2e6fbe145386d9fe1f38c111c4f79a1f75 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 3 Oct 2022 11:14:35 -0700 Subject: [PATCH 30/41] Add openapigen --- templates/todo/api/java/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/todo/api/java/README.md b/templates/todo/api/java/README.md index a3a0dbf91fd..8553362a55f 100644 --- a/templates/todo/api/java/README.md +++ b/templates/todo/api/java/README.md @@ -33,3 +33,7 @@ The REST API will be available at `http://localhost:3100`. docker build . -t java-todo@latest docker run -e AZURE_COSMOS_CONNECTION_STRING=$AZURE_COSMOS_CONNECTION_STRING -p 3100:3100 -t java-todo@latest ``` + +### Regenerate API from OpenAPI spec + +Run `./mvnw -P openapigen compile` to regenerate the API model and interfaces from the OpenAPI spec. From feb544aeffea93bb18014d1983eeddab28a5403d Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 3 Oct 2022 11:22:16 -0700 Subject: [PATCH 31/41] Update repo.yaml --- .../java-mongo-aca/.repo/bicep/repo.yaml | 12 +----------- .../projects/java-mongo/.repo/bicep/repo.yaml | 19 ------------------- templates/todo/projects/java-mongo/README.md | 5 ++--- 3 files changed, 3 insertions(+), 33 deletions(-) diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml index 803fda53718..bb9825a206f 100644 --- a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml @@ -39,13 +39,6 @@ repo: ignore: - "**/main.bicep" - - from: ../../../../../common/infra/bicep - to: ../ - patterns: - - "**/*.bicep" - ignore: - - "**/main.bicep" - # main.bicep - from: ../../../../../../common/infra/bicep to: ./ @@ -78,15 +71,12 @@ repo: - "**/resources.bicep" assets: - # # Common assets + # Common assets # Infra - from: ./infra/ to: ./infra - - from: ../../../../../common/infra/bicep - to: ./infra - - from: ../../../../common/infra/bicep/app/web-container-app.bicep to: ./infra/app/web.bicep diff --git a/templates/todo/projects/java-mongo/.repo/bicep/repo.yaml b/templates/todo/projects/java-mongo/.repo/bicep/repo.yaml index aebad8fe792..ddcdc32c6f6 100644 --- a/templates/todo/projects/java-mongo/.repo/bicep/repo.yaml +++ b/templates/todo/projects/java-mongo/.repo/bicep/repo.yaml @@ -70,21 +70,6 @@ repo: patterns: - "**/resources.bicep" - - from: "PLACEHOLDERIACTOOLS" - to: "" - patterns: - - "README.md" - - - from: "PLACEHOLDER_TITLE" - to: "ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure App Service" - patterns: - - "README.md" - - - from: "PLACEHOLDER_DESCRIPTION" - to: "using Bicep as the IaC provider" - patterns: - - "README.md" - assets: # Common assets @@ -166,10 +151,6 @@ repo: - "build/**/*" - "node_modules/**/*" - # Infra - - from: ./infra/ - to: ./infra - # Azure.yml - from: ./azure.yaml to: ./azure.yaml diff --git a/templates/todo/projects/java-mongo/README.md b/templates/todo/projects/java-mongo/README.md index 76f8011c4d7..7378abe48aa 100644 --- a/templates/todo/projects/java-mongo/README.md +++ b/templates/todo/projects/java-mongo/README.md @@ -1,8 +1,8 @@ -# PLACEHOLDER_TITLE +# ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure App Service [![Open in Remote - Containers](https://img.shields.io/static/v1?label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/todo-nodejs-mongo) -A complete ToDo application that includes everything you need to build, deploy, and monitor an Azure solution. This application uses the Azure Developer CLI (azd) to get you up and running on Azure quickly PLACEHOLDER_DESCRIPTION, React.js for the Web application, Java for the API, Azure Cosmos DB API for MongoDB for storage, and Azure Monitor for monitoring and logging. It includes application code, tools, and pipelines that serve as a foundation from which you can build upon and customize when creating your own solutions. +A complete ToDo application that includes everything you need to build, deploy, and monitor an Azure solution. This application uses the Azure Developer CLI (azd) to get you up and running on Azure quickly, React.js for the Web application, Java for the API, Azure Cosmos DB API for MongoDB for storage, and Azure Monitor for monitoring and logging. It includes application code, tools, and pipelines that serve as a foundation from which you can build upon and customize when creating your own solutions. Let's jump in and get the ToDo app up and running in Azure. When you are finished, you will have a fully functional web app deployed on Azure. In later steps, you'll see how to setup a pipeline and monitor the application. @@ -27,7 +27,6 @@ The following prerequisites are required to use this application. Please ensure - [Java 17 or later](https://jdk.java.net/) - for API backend - [Node.js with npm (16.13.1+)](https://nodejs.org/) - for Web frontend - [Git (2.36.1+)](https://git-scm.com/) -PLACEHOLDERIACTOOLS ### Quickstart From 495ef8aa3594c39e862b110a9f398ea98b88bf64 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 3 Oct 2022 11:24:57 -0700 Subject: [PATCH 32/41] Update resources.png --- .../java-mongo-aca/assets/resources.png | Bin 0 -> 155604 bytes .../projects/java-mongo/assets/resources.png | Bin 123324 -> 134907 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 templates/todo/projects/java-mongo-aca/assets/resources.png diff --git a/templates/todo/projects/java-mongo-aca/assets/resources.png b/templates/todo/projects/java-mongo-aca/assets/resources.png new file mode 100644 index 0000000000000000000000000000000000000000..229d955e1e3d9f4314a3930217fdc530dd827c53 GIT binary patch literal 155604 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
Q}5m=97TAezqxum9GV@%v+hdnnPKgc#w}0Xxdy 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 JG6~}^{||USxAFi0 literal 0 HcmV?d00001 diff --git a/templates/todo/projects/java-mongo/assets/resources.png b/templates/todo/projects/java-mongo/assets/resources.png index 07f06cb01a671f5a3db821b615a8e65e9c52626c..9997056c8d2eb305501d0010d5164ee026623367 100644 GIT binary patch literal 134907 zcmeEt_ghm-7jA4=!7kDf5JZ~Ndr^8-S`1xED4~~xj)H{XBV+%-%Dz)|xeIX4d=e$Y;80w3iq!0RRA64RvLG0N`93 z0B{z1f##%S)e0_m@^#T&9pnW7T)z3w=M*6Q)7_K8Q(pRNPXOh8%nK)f&e|*KC;4re%YEtN zltTZlQ(^@UKW>Oco_m%!toP%t3_C|?Yya7^Ym7rwIhfv5=5Zi+r=FU*(zo0vkCBJT zRISi2QRM5Zuu$lnO!nRqiM)5})QK4XTcrzKd+ zbtT$K>UNuV9f&W$%yK9lD;?bgbkmSA8{GNmkK32eY?mT^!mb8^vo;%xpNH2U%8Ljz z;xgd=Z7A~7jv~ack8kENYVRAVHqFjw=y};1&u79w4pOHhzh%XQFzE8c%|z$`Z|YVi zWf2gRMki&|xaX59uuy}Y-*~){gY?HjJ7!#a3_wHw*;$>JE$!M_M#Of&-kq~bCE*~X ztGVsn#sx2rw#Ky>w^Bx9Hzh!S^ZsH9q)+Xdducj7wb5h4uE6iasJluzm2&~`=A-@L z9h#QK&TokDst%U3PdVX~iF%3k{ZRy@ZEYBH?lqx!XTI)T2FZV;gq$-eZBhk}nJOih z*9-RBXBdv}|H9NvN{eoM#&if|Gy#z%CL8%ZuJ8!Sx+aRpqP<%c(ln?vH0o?cc6?KL z&&7Y`e$}U#mPGeuq(V^Q3{b>gEI{_c@AlZImP7i?q^tnfB}n?AX~|J_Q*axtgrQu> zRM5^_0=9P!j&hjz;fv!rkgjskW zk$s@WZI&kvs59gRix_g$yT37F&bH66U~lTi(zKxCcFB#qM8Wk_o%zCgN092a7efB& zjvtJ5e8?xbx@s7OQ75SkiT!70=`$^>bh9+tVyK0b1otz^($O?UV)KymK(XlsngX#^ zhx06A>?Mevtww~V?R<5$VFXj@pzxjL174P)nfcv~Za#P^)!$4}qWn{oTr`a(C4I8a znei)bi;Q2!&p4fXV_tCf9i_5IFwxjk=nBf))Lkg&ow6wDaEqjO z^@?Zyv)|HZu&?TbFCm6#wRm($ZTp^+5mSoz;=(9dedgPK9ZLfaPy&9Mk@J8~`=f5vEmO8$ z1`AkuAz3Djmo8rc2b-`|Bhx5`B+yW9`Au_RI_vo?}w4jZQZEDr`G(bwkE224v>_l&T#9fTp@ zNyahy$#FhCIoI__s;m8baoS($(>drq6#nHnppeE@?CEgym@OCN+vD=3cYK0gCSjX3 zVi3G?cz?(Kc(GAQH=(*vCR0?h6boH=OOrtpOz|n&D5XCw>fk*0JZujN5HF981V=)? zkMkFnXK=N+1IGy7!1{4OX>ynUw`jW%0J>an%C`nD|V7m?kf|(h~*l3tMaiRi*S)iC=;! zZ`YV?R5YIM-4SsubZB>TX={>Guy%{1Z8`?0$Db=l92y!cj>CkG1p0QS66X(6Yev=^ zk_w+S1{b%xG%@*PRW%34%f*6HP#BRS)XFAwkAvq@zcgGZLAOAM8TFXQ-+KC&HK zc+6pu;qD4v7zPUtLJT$bmVJjTo7{GL(9Xn4%!+A`$WNDi|Mom5+(_bTNmk6*E2qXg z&66Ay9{B!-`%W2-@Rc=$==DCs^(Hm#BlPW_EF`D~Z(5=!SMYUT#wvuq;bYn8q-ROC z79QXZ4b-=3CXHMrvt@sQ4;|B~NUV)&&B&(|KgO|fLk$qHG>fe}JVsv2T6X4R*&5!p zPAv5KPQ%48{BSv>KW)2=SRt-S-L*t0gUfR%Bkcyx>r^}Z+ugMe<@g^ubC;+G5Bv|x znZvsEB;yD*T`0tJ$dm;r^{0_bqbs5cyyNRR(D2FZTLUnwvD7rBZ|T$Qy&}s2p6$K$ za7=7Z;*i|42ZmJ~p5ES@9Ab`eNbOg`J)ZZ#&s| zG{$w@w43RrHv4$*My20m(&?EkhhNZ%Iv*oDDbc$Q=OK`D>0)8S1&F+48WxJx7n-}k zG7}>SrjfJvD30wqzz(v!TY-$Zx1ZCwFB4a&CQ7yeSrdC@M&j*sA9w^3JtgPubLeSi zPq%9fb)2I&yS7(v?6PJ&@Es|G@gTwy%Ea{L5-02xr!v`YL*6y=4fpc@ax_kBz|7{)@F|)ir?Tii!v$mqjOx%9&l8s62V}Y(DEEI8gh+JXPE?h4E+|YEt&WzR=f}59(Ok-2nZ``(?WUe=O z$2K0E!O%Lnl0L1mBrmi4f^j6x1fvEm_wafi*eI-Q2EYidyqq1q*2F}+)mzcV5JS?M zP(%Uc57h8>xo{Qi!LCAy1PI=s`w*Vg{NRR+HHO9bVf~A#INh%e%j6g=L&$G9N=Ppg zGZsY^_9udKM=aB!svariz{iarssT?#x+5a)jm#fn7F+o;HYJo&AD28dyDc$dvyyB>?yzF z%%_!G&y=KcvRGumUy08a9_*Gqo@3% zF4xI~z1@VNm2@ijhRy`S{Kh@>crsH>Hf{o^8m_|*7yTnmn-ecytAA~d+|bHr7?#%Y z($c^2GgGx}YbN*(AFw={r7!3>{>pa!M#AQ7w~&M}-4)za2(QG$*|;yU>rFrQkF-P~ zLjJd#Jps|-v|nCcf#a(i(nZ)kl%gIqFTSrN-FHCg#53gx_GxTEH0C&6Q_HzAs-}Uryf*E;Zy)&)5@$JCRG+W8; z2}iP}reqJN2dALRL{pUu6|a#7dR1&*#g+!PE5+|vKFoF_-nBy~9u@+-q)V*@ANVaF zm~J>V9cQtaeIpg!klf*<#tw)Rm*1g-2lrMRiUl|xcI_zm_bqn>%OeE2-^;+k$Mf}V z>Pr<5*X7n`n~#Z^5r?onzoN-)<=IpvrzKAgZ0dX}O4KPJgkaI;_JeufiEgp>O#R0F zgx_V`iOD*Hj*mVD74DrL8g?BYi5z2kVd}RxX1dq6+yB`*m2cVCUaxTR%)5qVHIwrm z1kdJUari!Fy`rtRYNW4JpfC{kK)SY@+jQSmi^ybR^WI?2RlI4dlU`vRhPwZ8B~@|? zzD_boBhQ+ax%}MVSP_Zq4Hm6S%KG6Vw6%vIVGfUE#*~OsMQk}y6Q>L zZfO7tI5xf=@>|jwKC$SR(kcI}bgyFP{0$M?)|dv_lKw*#KfY~i3urR%bv?g@?W@HV z#j<8TOhEkFuD*~`j(@oF_{z&YDM;`!Y~tg=4D39yCoWbKpD%v*XpK#;^L&%Yy)e#X zKEL9FVXsyxV@_-mZ=|Rv=ak!2S5l;mpAfBmW8;9Z!w<(i4R0Rbg<5lAqjX#;@t)}A zaaw&y(ItrtSmlypX-cbmVZP{mkxv>z^exNML_N$6?Saeaiyzb-8C4yx^9WlkkbPIH zQ*h92IH!iIAND}$Km+R5jxLgg6bha%chp#ZX;7C@;@UrqyZqq2Nao_>(HIci$rI;R zY5)DmuW902MT8i|ll+ZB#dA>>)L6A6SAYuJ2Q;+TU?6h!Wow%zi|Qi%5RLKhw_@wX zY1QEZ5_w-}(-&32L@`VhgPyHm2?_t{E^5qi%^ZI*YM8dYTUfb(!4aj(RFPcTgQDP? zd0;*^kO zR$rgC3xBedv(27W?`XWzR9yHnrDbo_@MyCvF>C&kfP!5p_jXt8o^F6~yRKtU$9+TP zN|NjjRjAMR=je5lv3I1v5Lw7U7WFVLn4WTovg8{DaZU^3QRDoI0se@l<75q^ZMOK8 z5Zi2$^M@?u8yAZ^>@ZDPo$k+Hp;@8eVlV_^sRyCAe&*S$!#) zF@D%Zb{XYRa2sS;wM0D3sWN+9QhzW!%BJ4S9?wugKUnhE<}tw)b$r8~zJK*(?GBQd zjlTPi^@1N}e^eY%=A zDbC`TVJYTo_pLi&m&0gk<1CxK0Y|+VOjj1}$;?knQ48(fKEh7E7{`1Le8k@@!QH#u zYm{)mEX$+WDcgxH@1U61P_L_mU!R$*6R*<>DhH34S|7M}Rh5qcLuz}5n7biW0}qpn z56ciX>v@YJTX~+P7el1xYq4cVO|`FQyPs|QLg0fYrnKZ7#A5IhxxgrxUJWg$p# zqeR_R&#G}b`|4%;6%AY={Yc9`ezjk(J}_(Mw&l+FxitblNsbp@`BJsOQDNKqsCcs3 zk3*kIpRsL;kO!*8h=&A@H3{2pYCS)?p&St@`@Wpo9pt^Ad^hZn0o9R+qST4Duh*4d zA*cz4@5kH8OA4;X2ZR%=ni=Eywd~NVf5L3gr67&!E$9T9PU zcK8dNEf3(;Ws>K=7o!E2^M3Z-Sm%?uCejRM>?!=L{GO)St#J#l4lsil3_Zks7Ij}p z(f4pvT$_y&Do;;o((8bWeWqNoqve7qnw{D7Xz4^r6ErNeIMKbXNza#4ZWpO2@HLLS z_7~7ISlN)fF@E`?+WP5;dO2J-80i>!3w;H~k&l82*Qm9h{=xiL^|FS3v%{%PF9P?vUT<_iJ-sePEGQSGc(UiL2m^c0-O;He8Q~0kb)W&Mf3h@l zZ-;}B>bteA*QaJMnQ44gpSAoB3}>_*hu^*?vp4%>pSYs9DRU?D)eDi|AQ4LjHPlge ziwFF`VhXO^f7Twon&l>hqOxq}V!hA&-rkvF?1SlQqM@!$$MGw%^%UIxk?Bqrr~tLn zOp2~==`?3_fZJr0A)9j0X=vNa6XpO)BpFNe85Ll$1ipq!%rsWvu{Lu{1T zwB=^k;TYnYKUDS;8kaGHZQ_lhKa8F=bxy7=XTF->67aCfp?zAOtx?d4&7SXRZFBY3 z1i=ayVd3Yz(lp*OTeH~h-XxND_-W&?40{w8-4AyrFAsLFh>5r~i$@ZgPZs>)&!1fQ zYUC_QUS;~DcN&XbIKjULlsb`9re2m7thF1Tcr57STTAOQZM53a$V-oPw zkbuN-Gpk>RSN+8|9lxeaGI&cz#=>d1DX(&9E}LFA#PfTg?;z81zGm!|VmgxDA_FEV zo!C3{hHxOc0krI2iqrT?lZTe}CIPGFOnC*r1ux{MvZhoDx_)oOSJsld%;Q|$#}9kO zIwzO>u`Za2*e$P$pFY3-LCFAs4@Nxbm4wvN#bivgdriZ3l0J>^9zEA+OM%czGeo`e zfl-S)`jTapxaHP?9SPQ@(D=o4Zu90@cn3xFc~}fI=NIh-{H21$0MQ(W^W0lfEKSCb z#=r%+O6n5q#h~BYtKbH4+HYg84PZ?^tfIf%Lg!7=f6~6veJg`ubVtbC$5}P>RnbiA zSXm4;2334ERx8jXnOZ^$M0CvAJm^`B%N{~4im}*cv~-aerRx`eNJcpXcCe46GN4Wc zO5AnDXZKa{lCewY7=xOFkH8rNc0(?`cxU@B|7r&SYQH$%4r^@s4EL&IC{FO^bnN8| zV=EHXzcoc(>jyQ*c6=jEnTrF*{Y!ryF^lGqX-a+My+Jv1kizt4zMovq>dSF=~T9*-{gH_sNFd8vvj zQZ26-LVg+%3b{32$z_x_qY#LyJBi;4$f)SmH=>dY(D#n#xy0Q4D2O3diy`&`@GHo# z=WZI6$v$^k;56bB-}7iDDc^Hx-V>Y>$CO|JM+iDUv+2s`L0;xHsw|=0c5|E;11x-4 zCobP&^cE)rS16^sUEYt12x;17J4H}1!%ppd4dG~CaY5Ss%#7xl-!Y*B8bkH{Uk@Vd z<^F?dycyBgLUfASdaaMsU;3j;C#3Fy5{s>N+f27Csh8gJ6tZMCK3PtT7yanB_LE-i zNPMKT{Wj3-I=K5}6ksN;a~{XMjJ z!BC`{!bmirJ#uo4@h5lLrqplbVsNHAF+`Q#zW$LCOY_3D&+4ypzlBHltC3h`jXP%na z)R86RWiZ#M5jM0fTYul8m%N3K_p=mf@eIf!6o8_5*{nnE%;7Z+(sUCjT(MmjvU|m? z=0=>K?psK-)#FKqC1xKo^IcO5{=j7Y*yd_X675xyA6rKxINJDt%cx~F@yIog`Rvtm zSJ{HtPGDjc4JXonph3>4NRzYX#GR+Jpex~p#qH`+*Ib>3@_1se{x??uywedchxoS# zh6NmNwSQj_J%Pyoy-a%eeDc!din_1tXdRDW{*(d=RI6IVMol7{!9v^V#l7wZ-y1vW zE89*D3pO9Dd#YuQDuGL6IM4n2cxS2lSFsF@PF}u5>*8?goF3po{qF>=R;K?NODBNh z4x(w=42-ycaxK#P8EX8&-Co`Ks%&xSsp*N&v6v1S?3f^&DRy_QS$iHAfQ^g!U6^K|0GsKRuqYTMaA3v zsq;PQ*3+qzRXm_#DCu0A7TYV5%F)@s9a)GDrlaXZ4eneK`fTyH`)aca*7Gb5tbXa& zT`OA~oh>r|JpQT;O(}RB)j#BYt}Uo}{oV%_x<7XWW+ZlHE)SfjxeV$dUeE*|E&X(x4^6M{za*d=;T2k3dzS_nk z^S33F);tb-vE}q8E8jd<)Sqqvzn<+og=^)z`re5`{pSq;fQgV#+6?r){Ouoq+w~DW z98Pt6`QAM`}Un-98{~1QWD{1|q z*Wffg^#AAy!bJ}gtwX1{IX_wbt;rslWEUPVb9}bt@0g&~fse+oLUPZpxudV}u>aLv zoja4o;m+}mzfy>HTJ4GjiM8=2{v}0V`NHlEd)tMl9{p7+hoR`w$&er4Qu6pyO;Mk> z_liW|>DfR3Unvg&MH&uJ>q37Da>PUz(|?NoHayp+!;PZ(DTm>_^H&6c6r4ZvKPqel zam@T}z;@vFm8(J;NtLblO~n86ZvfyIBPhC|fbZ_I0mI*-0wYy&US7HOdpxbgeSPil zzXq@>*1Rnh7}KaZcjDB`5!n&;bpv_-Gi>XlM`8_|70%VF^6qTl^ zKVLWrCl7&Ktw}*n5&yT!ferjXuO^RAWL(I&AiHVMj)8hLCTbA;~gY5sqDNZs%Qa|H=ey^y15;`&l9+)VM7CQOPp|ce% z{~@+CHa4EF9&HMu{+oJi%isU^G`JM?pK+iWK13WJ8+KR(aq7O^MGpI z;Sfuj9?!h;Gde{32B;3tfY5L#`)=bRDtTrqC@5&Xm0s5J(%VpNZEba#{`QoyUv;ak zm+wbaKll5G>Y!wpPtPNWnhw?GUpd)unp%_-Vr6vk<>pL+mNFuz4kV>lNT0lPCw9o| z79odQ#Acsbq1xX!PNJz|K#ymA;6vk+>^+D_Vk*$9P5dz+hmQ6YWE_{+TX3&X`0jG@ z@%;x`=O!j5JX^f7IQfkEQ_aeEZQedv{mHZ=x3I97aJ0NVqK){RuVgrc16m3I&3%$> z--_43YvtEvXNCTSY0i9 zhl?@(#HZE$Mf8Ay;t7%O5XV~=fQ*AfH#uaq{$c(tc%9Hl-cZ*4U8I93oNRmVaynf| z|G}0n(<$!fgn!?|t@V`?Xo+j!~Agb;n*5;}Lf&(e;BD_k=R8#&k8x zT6V7t}?z z=%R^40?aM`DWPA{SAN%lqKJBYr(sngZYe3(e!J5kHtT*wBF$|V#%uT`YwC(BVqY5{ zPTi2BwOvGehdM}j653x1vpK~)wam~ilP#;T$M)WYN$(>CAqm+w>6b5ngVAOE0p1Kt zKDPc5$kd+Y1L3Yf6u}wFyuB|rvK})po8gz;O-gtZ3qz-i84;f^ntylv!C$2*eT=Bl z^LmnM%XGq(ocB(5u)zxZdQjF+*h;zyAGPZnCaDNHdZ7O|W79{jfgThus!ss3w64zn zw-ChWk|_Bx;j4t+b_4Hd6+pP_he_0_7hPWraaXQ_My9jWz`mmsyTe(IA z8&@ewZRkV4Oz>D;%r}1!LptJd$kD-Sfe$%}W_Zhua`(ARdp}9+V^JI-c=@ZHiMKCH zyZ7%R?4ak}ZOKiK-2G6GaYu1#@YA8>zOcT+zPP^BzPPj%6LQy;+@7yQ6YZj_jcG(- zpJQ*y#)aS<{I2(ls-~r_@?I*s?9N8*2zjX2zAQb=|G84cV{ElTs{ab)+y)kuJA(P; zthX&(zX2z6#e#ryUcfqmc`xZcuCaf%AjK@p(At-y;mcG+5UGZ=yPM!SHIm8{e8WiulaWEQOWDIyON7x#rER}_m4H&@=4xZ3TES+25aBX zTn%Tjp7R_PEy3r!YAa@KJ}t=eI5y0P@avIpQw#qJD{Ja` zC~X%g3fwu_7+^P1w}oq4niMFTJvvG8F^fHI>-&HoxQ7r9pUCP%#2b-$f=1b~;Ugy$ zHcpJ&@V9%ybhHIyBMZy25Q1Jue07^TOwvV`94L;J32G$j*O^IM)-Xg^S3F35kX*I&o!VP@Fk zHkk%%4n5R_9c4_k``kr?-I7me3VsVA(Qo2(q{{Z|6WXaAj`eft4nxe#Kid3OZ6>AD zKzwB>9~VB-6G$z#=Z1q|x2E)E1v5yE>t?t`|M56K%Z0sx&7P{4bWYNr?Dde9>%E)W z3LH3t7*nmLswcegyznlZ!p6m4GPXOWz~ zx~dMcNV#G4T8e>~Td=cwhigcEN#W6(B_XTEmpA$XoCyPgr*Y(*8GdmQiphqxgq}_M z@>WVM4c+ZKCR^#7I1U~&>lSXyyg5wQdu1qR$8IRD3wz{fDDOdjGhQorA$(Uf1l(?O?hEu<&s zz?!U7yC6|-=U$p{yWGp<${QY;YI#)2@T&*6F0FqLyJ|d9<2>=OY!)o`vHc6nStEq> zu(#ufn&&Pu250K-xV*z%dNbCBVzI^(1mgzwwA0b0J#Ip&;@5mw5lRc<)?0i2C&$Eh zahH|rTkJ)gnPFLk6!;zUo#joPqH7srfH+fKIi*Lhy`BzXy$4~@8KkZzpdQM*iO@}) zKN#v+(yfdklknX>t87TUBsS_}>UHXe=dy2pAey3(jtW11e3AvCBW_;U$r}({V~ib) zJ95dqjB}O>=i%-<@Xhk!Uz@cdS|h^BUh;89N)@eB>h-OLh5EdPQR3%CrsO9|qTBfn zfq`X};Y%dQ`PK;$eubkSKNw?z27ni>f%wQnliguQ#k!TPB{0gTfAkX$UamVOG9PQ1)^8QmF_~Tb$p~ zC%Z(Mj`t9xQ@v;1DABdPFQ}OzqUPd+WruE|DoF+*ilvF=tG@wby#cHP3kO&AINS6S zLZtZE11k^oK>2d|Bb|XoKTelEH{RX;rr-UJp3isM==4lQf9Jf7P=VatSdoGWyUG;` zd!wJca|t!M09@O}+Yin;419{9r{H--=8)uPu*Z%OpZPF5lT( zg2=7_(Yl!+L4*Ni;|pWqsrZHAo9|4c8G8ivkEeVj0}zbofuRu6W-oRWe@?Y3raL*RI+>%5nDGrAwQ)}XT@sCwDwa#BB+U1HVM;p zx|SW!dp}qLjj$uO)7+nXZl*Fghc?78PC-{KNLr~HGDU;EmuN4Hu^2DP;+Rs+EzLzf z=)^$H)im(+)K7kvHwqG;W%PxCI{ZaI{o8>kdLeC|%(`Xoy)CcG6FmAcgY?w$+t;dT zlQp;!VCoQ3up~HGdMdrKtY@jbnJe>ax{KKqoZzXaZGyXA0)9KSo)I|la_MQf)EmR? zG>h66?7-8YvYHy63Xsrj^=lobL02kw#z(A4Da_R-Qk;%2#3&TCjMBL<8k`HvDzMk< zO&$0E<&H^9kkWWBj?%74lw+OR$Mj}MNo|&~``8^c86xU_9sx=n-(J-W8G3PI@+i9a z=#@@}2t;skY=1wd9hv)pD54a9e29C~FcZbOo{zYB8sI>SJ{y8fRcizIa%_dFb0hOHs2v`6Ln2emS$CrazGj zHSd|eU8pnG4whQlE@SeJgA~@2z-X?~;oz!5&uF2^5trM@%$LVRE>L|zDSVwaQaK@(*xT(D5r+_y_k%eE$uSpsJb3&7kZ1{4WeJQN&B|E`X>>< zR9sDIBMlD#T3>wtISr9sE()hYizap2DdL<${>yi`mlqU?DpYVb`(6yUVZ;UqFKg#{ zXPp|S)0sUf$q!-eb{cDF2zyXA*;PKhom_sh`vq3ZF34u1?4BG^Qs(K=Rm}%8H<$ZF z_GqXPdKrPnyNgwrltevwsr65~!CeVI^)JX*!R0HpxSa+8LsHCr^tRSFrph7*P8Adu zs%0H6*@MmxIbEjb|Ik%z#PQQzD}V6e$c(Vk6YRS|_8M{gQXN!!0#(V5Xn%Q{Fe+Jd zW;*@nhw2J2W3b z<;b@n@Ke$Wf-fUHU{}f1DJ_S5UY1=U?-sfVC8a06JWt&cfu7lwcB40Qf6bMj4QiaO zZ3636J*Q~GsDoSi3LwM~(Uxpkw>)Y1q2;>F^uo~L{V#rKBx6XEs6)1HxMjeoMV^nH z-Rq3KZKqfc2CwKxS2=FFpZCs=>$Q>^Hw`-dd+cU{1G&1vxCg$6-+T{J0tfB($u}74 z{wVR8wF|+|#mgz+8J zg}AX?4(UF|7wVPeF#x=!(Wj4{-T6uyWnwGoia78ujUPs&ug{3@+8Y-w;cOkBgr?9& zYt=aZ7d(BqwJzs*Cbs} zmj>R}hE(XpCB~{3-dH55myB_mHFjE^wsOC)_uD+z^N~Yt^UNpy8Z^Z#b4kPUe0p(% z3X}$Y0d{8Qo`UDl@4l~4F4^YW`c1FMM7Wrg|*vD!cm)+o1HS3DyN*neVx#dBtNr|pVL0J&D z4qc(XWpzUyn}?&rrKyyc(lymgUCS66$hm9^5pwGSP8C+>=V17y9W7Z7%pNCZxes2t zHnwpGXr0#|FlZQT;v`LvGc_Bz5#(AKvnlCC>T_}0MJ?24o0bHdKvLBo%e0{w!*mng zZ-p}7$-<46d{UI*5yBgA=Ph+{f%{?HOENy?B0N> z&WzbT?_NQq44Pa&0Zk#OZ`;B@8h+R0$iYDQzO#2le2Kr?UtBj8T{DzZ!DB>M z8Od^i5<<-w5o(H;JN|lm6YrP4Y=zQoLoa8QFAS4}MpY3*xdFkCMsDyfR>=KSuF%Zr zu1XhJbBQs*BwKokYf5ynf68)%{7A}69AL)9Doaz0WMn{GH!dI(nFAxk2etif1>BJp zl5VuV+3zCL&R;)KPb zQC(0OZGD`$o|{;VNRcgCQ!~41X>9@TSB@JGSWbCvNj$CLZD@pzP1B{sYhoKra@VYl z18}hWjPIxijW!H@*W8vjbP^5i!XxTG4bc7cPD%DL;XKL5_gMZINHu7V7;V9`$v5&{ zv4tp7)kkVvGMJ^kAFPj$=RB`=n0YcHZx~RRqw{L5m22DVJ_N>mMJvBy8nyRQEnQOv z9euf6;L2S7?Gfatx@Xv@0uP6Rk{z_Ib-nk&wkXd{e&?T()vpUBXoVs8cT6aJGlBfMQyPvr}SK3J2)p z$+<#gdceY(ulp%2H%k=EtcHajfiAl&o^2`fki?dOjuo5e(FesBpQLLqC0P26pE`j~ z6e45I8ZICG0_@gX4hnef#~q~m?#8Rx654g*NxCwW!AEzOaeH~(2VLh|aWzi~Gn6Cq zr=BteGy4VwQqoe z4vnbBY5Z-P28F|o3Vm*0B57b$(06L5<98x_mg5>gl;8!sjVXJAFY46NC8r=2O4PtR zh#e4k0J>*8nh*7Cw;gQ-S!w1E=i6*njL|Utk0ldG2|WG8C0p1Xf~+R8U%_F!R( zA(|AlH=0{dglAQ1rwGUt=(Clb8?VC_gu^&pV`|&bF5hduRDd-rQS@iLgMQdWIe=Ai z`4hm4ppO2_bkIlRgVN51qhM)NwojREoU=!>sDo-r%}IXl4Ouv?y-6NVkuFb>eYNnI z@12jOpOV`()b%|}5-Am?5P$WIG=&v)>J{`eXlBaKw_$PoNUWruxNg6rneI?;HU>7) z8wd9(j6)sG994jgP`{GyQG|@Sn?IcmGGeQtRp7Q{@(o_V0K^#1;}&3&&CIy-o7()C zSo5Cfx;&PW`c&yzAlPkxY_7?OkEdj2br2j*Z?|#j?OLwdC8DtY9R1xMlHWRszGkHZ zy57ap_5J%RZ{qu{wb-l?PCbycR&d3Z74BQvxC%2f-}Y(v>(z}u86Y<|w=Jp9ywa}c zPTKn}nxpELue3arpA9L8)SV9b6?~Si{+HZ-Nt4@2ahJ!_+bd*fUDS19*G2`Bt);1H znvu7Nf>Gd464I~TnYyF{8~c>TV#ZE=?Q0%mNNm!5#4LGG-jJgfyzYDNLa>@l?$P?_ z#XU}G?Ace!u2h$%b+rZM-}9iXhP|SN@i@HJ*LPY24h81RH31n5ArB}giAEP|7it~Z ztN5ZEV1R-NCA4G2b>A?|K&{A3S9NSpNEq;TLaF-6`WCNyg9{tH`Ofj1QE>2D&E?Tt zQB47!Z103mRsM)iK6nt3Bq;CrxpxIlHx2W%=xH+S=qoxfJm?kayFhxmS7~GWu=@J% zl+j;(rcM*%uOPWOGbiBw^JKdjT>~6s-pSb846TR^OU1S9tIy`L9Xd?(?x4cIr76G| zBlsK^!6!$>TN$)(_+Xhs51GD@M@kdH3dhi!L#G}n9G@Kx1BV<>*5X*qrw)~s0D!Kf zu$f@uc1j__&GD8?i1?VGgpw&zfSko7I?GLPs23NMF(YAIH|kcRGRkXkae1nsWmo&p zbyv29^*PSH0>88LPmlC4ioJJo2Gdnb2kAZ4wR~h&dV`liC~=vA7iRoo?ZmG&$jA*5xU?WLT0VY~-2ht8@i;zmQF;+LKM!l_QF9!$U*fdl_<%({y7Nd&&0D zJUxq7y4wj@KKkS>{mP>oPUKT3$@dR~Huaj+-T}X4X~*ZO)qF0nAxJ93bP%jr_y8$T zLLq=hiKFGnvGD!$zKDx`8PM{qo?+s}3HA!drx~^^E;4M(O^)N@<$L#w{Fq_#Ur5S` zXD3GUpV5HQ_&$arDOS+db`a)@o>5xTvsyj_g^jeC6L#~tO)a9nu8eeM#!Lc(oabI* zYFGJZ4^VT6ayZZXo&v->Zf$5gS1*N}uo0WiTYJayZog`L#>m*$r`oh{>R9li50kA= z&my=Sofjk*x2`FqS$z}NPZTv2!- z?0hfT5(6g%XL@I*Ug!yuRIP8+k(Nc%HWs3gUTyBmGdJjzO7>k6&z=w*vh+)b7Wp+# zY~#FgQI_(fls44HXA_tCwx2G9#YPL;N7ei}W2_P^j_se7F9Cc8`RfzAW-Dw1R6}RL zU6uSnEvo~CH=qggc2vS+M5_+FEX6ceuyvOGK{*mi65kwOdMD|@Qap@7FaIy#DP^tAee~%W!c!-=Q-tc9BKzgld(VydpkMuo&6`^2t~- ztuyjNQl0vJQn9lm0UiQo-iSQ#n(kb3Jo~UDF%%=WQ_e}s=Rvvn3esd`isGoh<>2e zxd=8tw`N=1!ceqkEwlE5%+@a>3bH}sJg`^7b^Mlm@Pd{F|7Ch{U~|9;X4+Iy@G-K{ zdqLl?Wh0xOrnC7dMod^*1M%Mv0#G5M%&1!m&c*?ICKtWg4}XV2pXv^eNN&m55+|+ z%mvMx!0j*bRNG3y-TuOai+fgWv5W^V>0 z+Oh(a^Nfm-jiNjXCXbM>eCgHi(!K}6Ts%x9l81hBF@3&Xf0bP&@)iKM6!t#ogN6h~N*%oRA+6jBHPR%lQYdgjNcqY) z@T1_24!|K6NO){j(Q}URpVR?BF^MGGt%+XkmQppon#|jC1?ehkaRT>7T!bfPM7s;O zono(bh_gx)s*UWbp9yE;2(k3+x_>e+pM_a&x!oDIX8_5X6_kKc{T`&?k-b_Kp8DO{ zsGd0TmYGG|wv#LDMiH$DK#^zd$7WF07x`bOa^!rIWwvv^{_HzFv{CafI+$Zpq}Mh; z;J@hgK~CuZkaX2yO}+1XG}0eYkVYCw=?+1VRz#5+Al=<5D2jAh0iI{zrO{NLjYtI}{}-v~0-xfIF&h2*6aa#!w6BPB9#= z_ld9SmRV)SBdPb>AyOmA<*iwxAl4nUxymvj3kLD&)?L7L$66&o8OPY+&xh0%A#zfgx{B-vM`18w5`uS5TLXK3I67B?1Dy z{)oMvQ0E2;RYvc|eE$v%=jSK^Onb!jRxWA+z&xp{sS+O+5DO%~M<5VMvv(LI&;Hl^dA%NxdkAeHC^&JMpu=K*t|L*44XTfKvC_6dfRZjC(R%pZ zS}M@lr!;S}_pw2tujjaqEBZj8*8fowfHZRk2x0DIUSh>UPn?Cig8XFxpg;~AuRnrv z04vlw<>O<6$`B%u#6wN-Oz^h4q)n5E*RP=>&%b`mHZ34feh(Wq1#sbZ@?g<*7Y!9C z|8XGV&1GFT#5hyRtJAe*eS&7^Q}!Wn+lR2`Qowf8AC1<4KyR(wJ0Yo*x$tOL*8jiE zuQW9K92+!NDNC+_Z!@A0ZapuA;irHNQT%ZF8-!T0q`1cA4wI}fE9TZB+*DhJ-eO@{kGCQxUFy>Dxjn%0OcqB*M${YCb-P6hXDbTQis2((_=5j z35zS+SD3^|bWL`WMUhR~Z~`qmKOqpiu6$Eh5mEZt;SV zxz>&&qh%dbj~k&dIq-Eq^e+i#8}JKZsaPP*Oj8VS@yzjH8=dvTjP=8U@T%P`VvS^G z03bA2_y*X=KXQ*iV=UkgtS^NEeux(CFzgXU_mWTqTNxc zU1TDMrc9P-`}Q0f?G50*f^DT^{D6nCH@zSOjd)m4 zWgBAwJAX7KXe2oWe>N>=rMnQ0dL*?aBiKs#*6{sk5U}w0y$`OZ7l#ClqTP$H8;qW>Ph`Zz9sr0%sa(^WSx;LW(5pdCLg4ZH z5uK`5d*8o{Qc(|IXP7!uOXZot0oL;oq^s>X7eGeZMo_DXe53~4d#3KbC%zxJzC5O4 zFI8_pUXRPr7BJI?Wpvsi^q@q@S((rc#0B(cJ$bzWYP#1E54@T|APJTwN7uYpfS znTrY{2mL96HcieuWZ7JJhX2E?Di9?A5V4VyN+@2yYtWx5%NEt`k591S$X&+Rc-tn%G|}RA@C0d<_DVbN$~qgwV|)*r5I6XXJB1*dRkCa{k~le_yd!ehxx#`!`MNf6$HC z&+g$ZsHE#)!nf>=quD8{iuK!TN!>r&<22U91!=}G5M6a+xa!;-pO?~I z#_2*hQZm*>On@~g0ojJxEJM=?LFu%VXfef;iYXHE`Jgaej$+v{Pr&yv zM1mwhnuaH(E4?*%|8ui&)nKn=QutA%P++#EiQrN>N_EB!csYiSz8|zLQUfe~zjuK!^3usU$?kY{VT>aFaaFLuT@UuVfN(Q&`%D!Ws0d z^G*ET8yrR}$5i(A@Ba{52DE*YOr!zZqe-9xrSncUWgr9Q5xXP`zpe`rJ*yYo37yFA z@@~w8VNB1!Kcad9-8)xJHZFJ{XP|gbsM_AOeuCg0s>E^3?`JnrPPhPr7uP?Pu04El z3HXZLXpU!~`c#+4s@xI${UX?|=?v(MM-6SJ=pWKWKz}(U%Hu?>H&_u}JHldNN)>_( zi5&Kg*hYhB++qpkRG#8qXJliBhSli==aKLoCmGEUoEoNW&eu`Kme*XJ-K2= z4sUEbEY#b4bCJCRBdW-ZK3aRg7ck){!A}@We)obXuEUt9Bglz@E#$=*S=~H8%=bQn z8;Iac8DH&Ks;Q*wQ2O@`foKiRcL%yy^!OOeeG8s z{7#Q3&g4<_nNb*POt>0tG0&6S3ypsWRMDmwX4+Lye762z7uxj_%w!r|z6z&f2T8#1>;3uF*9xYX)y&oKXKRny~6#Hu@Ysy*N}^3dfd3h%2-xBg;%l?PkW0TDT zhUs>$ucsyHm+fVX{e#Yi)<_Z@6qTd0kw7p=5d*|pV9VKoYRA}m(%ZlANuQ$>7a0kz ztjjnJABu}3GVNoVOHYE%d!t_bRiY%DATrTgCZ^WBE1 z%0bTF)dhRL;pXC31egLYcpXokFfj=9>mM;C-#1-_^5)I5R!ev^pnFloK*dup{-wjC zhC2-kidFuvCc)L$iz@;vr*Q-=P){%NbZ2^v39femftAM`;4&H6MY@tmCa~Ly6)!aY zb}^^BF5vzHuu|Kw-IU4H5h7Y$|1aXU>F{PQvwu-f(I-@-8~0E;;=AhK%Wywbsgd`f zK2n-F+@k&57S!6pBhh%;6$*V2nl@DU>I8EU70l%#zny2LGK<;&pm2P((XMs6&ptcE zLw(m6XnQt&`b8ENWf_?T;9Azcbe=@64KM(|+PHW%$cdceaS5C-Zrb+}P6M{$f!4J{PkMSq(62A5@8Bx#R>B!s#nNo+W=Y1F7S$4f1$n(HTNlE@2?mF+_U5q-BXZ**X(P$>EdkE3l%@{zm;O1bTeG zbqb%w4TVKQ|czl2_B;JJRNtyH7KgsrA)MYz2))-pUY0P@~-y0$X3V-X92D z4$U&rC-da}R={lS5r_G0(vy#z_O4>$wCcwLPw>M)*W)3qD-|~Qi(Vo!JE+YKCUnNN zG{yj}N+ zeMOw#JYl<|DPe0(?taNNVo>}pkKS0JwBh~4DD5ZlkiL6W@Yq%R8sUdu9mbCd(*zaP zGWz^?cHppB6oF*GUOF0j{PncliSqP1_hVnC`FwIV6aLmkJ10p5!A>}y4p|IU7;1^# zv>6%NdW9DS$KxD%$Xr`nsd#*IY1zFm*0RfxD1Bq{PVsn9PPXJS;qh{XM z7Z&4PGybiY2_1V~=t5bIRPH?A=(6`OuFzCh?df1e|61_2Eq1-o*6i36SHGmbV}MC+V>l zT_c}sd`%;IC22SICOl51g@DN`*rf@c>RxjW-Hdf;@dI}Rw;2P{eCsk`pibcq6b;mA zcLNbx(}tyL*wfZe?i|l&Dm-AajX+nNz&F4sPuwLp+hbG`JD)}bie;v*Ng)G0L5%K+ z%d8JcyDV^+LTx(Ez2TNBI%(&rVQaJ`$Y)lcebVYWbquFi1>`MCWUh*^B<-~+eto!d zONc?nF!}kuI)7FQelPExYYoH0I)^@uU)JPwnd&D^Y&~3T%E~Jtnp(ALN9yM9&d%AkH4L`7G-s0x5#;>OC zx{7f)yb+9I=9KphG$zxcPv+#KBc%0{o!}*v$prnp=~tCwNiz*@sxOQSJ}-2?nAT4V zuZ_Sro~bn?1=1CiA8!hm7+^CDTh?`JHZ{?N4?nnAcU|u5va=CMFZvtg^Jovvg zo*16A*bJP$3*o5Fk=FqGjcPXCM?Oa(1MuOc2vtiF)A&eTf*cdDK1I5~=TE4r)_#2? zQ!;5lAG~>%o|R`?EF|~qsP3Fk5*yKH7=~eh4&o4x=jf%UNh9V^eDb<7L%w}Bhay?oR{#!hJnW2wU_ zC7bpV%>4!@7*S)$(F9`cY(5YF=3er!iy(bc$g*h+n-s=Rm$mBr9OuGw^aD!ej?k`Sh#jQ%Eh z3cm%}-bKI0@4P`86kiXX&FGDwQm)_}Jw{h@34Ql`+2W*Kc|MMLfxC$>PkZGh)cIwD ztR-A}QKwygQz+5Kmb@nkHo@*e>C0qO$xII=&o}>e!|~aCrtbAyMAT)$)myQCF0QLT zm9%uw>ucG9Aqs-at^Gk%A#TajtTy}2>PPjHa%UzJ0i%9KsvTp6ex~i7Fzt-_SyqqR zAR0nitvlJKe5@(fzR{xx*lQkEUC6XvVfVT~vlq^*P*coVX~33)0|9)Lbh8en04C~8 zSv@*(9w4|vqA$s~MViW?KuPphE<_`~o;ZhTgiu^$(h%p~fAU~Oy!|9*LR;i#s}B`5}w5-$9}P=;3iej#z+Y0Z0KTnnVJb zb4j0SaI+C+i_XXj_WCK|=d`dv6BG0I&;ECx2AQkwIzSe`un&V2W%v< zWK|KdJZ3G3X0DTk_+|z9A1}#AR@|hSr5ke-f@$SQ3UqKgFPOhw z&k?Ym`EP76`oWO=$<>(k@zd;0{4PIXnu9xY!B*c8+o`mnj^A2x=Se2mJtwNO1ouGF zJ4z?<*7EP8hp9K(6fWBkTJlo3;b{QwW$wYOODvMGSDp(P- zlP0~@p3`nD=<#Ay>X%N#VP5!Q9t z=YMCOlq1I#3h<}2f@~WrA~GV{omUD&93pDv8vQT!m9gGRFMe>4b%=oeI5Vl9`XVbE zgzTj@HGbE(F!gkH*2~zsDVfa0UTgN3PE~bNb(TUoe`9RpO5mQqAfj{}ji{M?x1b~+ zCEm8DwQg~jJtA`GSDRr~|Fu@0M;cmn0QBHAtw92n}gU|)-BVa zEoCpOu9D_wJ~eDp$4T|(B7zq1L1W1q+(BjKF9(Y>!$a;-jHp{Ak_2avgV>k};Edf| z!C{#^)p9=X=Mt<_7*@%`){*3prlEt*?bcV8sJz+SPgWt!?rWSZ0qu4#UC@I%!+F>G z2^cFD9x%1vVl8nqd_jYHAT3yuOT0psOPWmkRaJh{XiCyVefA)M%Q9=zTAYtuz>j?4 z7)_GF_H`}ydT?lMj2snO7_xrbmH|sGEAh1#T$1Jff7 z#NVW#LH%{MfPVQk7%X>ph9krqbef5!BX^l7S@&^0`q=Pj+hnsYxTAmV`ZM~t^S}9q z*)(FEOL#_kbFus^&#FJKtujH(j}8pcAZ9% zZM=4PJBQiN>Ry0K%V(QZ>}2DR)gel`fa~RjF8Ny@YZQK9sI*wpZEvy%4Xriru*RN^ z3HvGKM0(JSWlUOx7^&Kva2B0iS4nIb5daFQZy53*0&#nQ zY5@d4%H;xzCn1eAY0kozz2tCbo0vI+_2#2tF-ve1kPgFOQ$OPtotK@K9hIaistC@4 zghXCdA?+@9@af;@KK}Ex>_1TETAEHpSJZdQh{maorDlzl+d>mXiq;QgFT>Y@6hW<} zQ|8-tK>mj#V8F~nJ@vD#?U09sE==r)IQaIu;S^cKul36CF$u&+iyg$cGVJF`v5py$ z4rexZt!q5h`QDvoYm*ytJOuzc_%CDe(U1lj{MsyV+Rjyz1X{RpQ>QoBj#u4%bVpRw%IN! zEvKk24l{3vOR4Lng8-)CIy-9CARQWQf&G`CayO>1yAMwZ(bhK>TF9UshXK>gvjjDBW^< z`uI=Y_)#CoVx=?U$h+WNy0|ll`S-zs-FJsApnfqR`0TDZB5$^Sl+*{AbcOfn_>(Sk zYjw+qkQP-)SNI}RwzNk3^$q)Pob@bu2HdXI_avXc7HfSREVSi7MJLh1hW`wj%{BG9 zrPFS1Q^`@|_RJFOJngufHKY4k)z-=)(Q(_ulh&UnZ{bYQ5Bnl+LS<5d5!`Ikz?}58 z0QysNJiGMd&iAQ-H={N~+c=H*om=VAj`DeCyq%ZJq8CN<)ehcWPs^{|0wRLxc>B(* zkjE}~l@zlrF5Z?Xu8b}--yN>s(?z<`reiGRGH$OUiZw9jXuOF-ID1}ReB^_+n4u4@ z#UbzY!Ld1;1De%F{$Uq#@rXoI=c6QPF)GWw=+;(LwjAm!^>BO^xI@ADZu8}-I4qM} zwsXhRtS9MW@$18p@PX9nwW0@~XNf*Hi%{4KS^R$PVq-8%RMdj36^40%_wm@gR+coq zNX4oQe?JrBs@fEW?cI82W_mf<Ed#UUPP;o<>q<7_%TEgF zl}jYFc%U)*u+__se1s_A-gR_T`Rwvgiz0f?jzX(5QpPAan`P$MDTrdD*&^Lm zE6p?W+3p>FyOI}Q8QwUs6YTcGaW0_6>{nd|)IL}*$qKi7G5hYVZKg{l#72Ut0>&@t zSH-EMROoJND*@%=it#6X2cJ5Doa`Cx(%%W3%#eujMcPW z4mV$#l*Vwx}J$5~lMulHKR`_KilYs6`vRch9sQZgItDevPce!PN%&1)y%gxl1ujmxQ=J=Nb4ds!NL0B!cs(V#HCH{ z)`mvgp(esj{G-n53e|yKpI4P#k5l8N*c0*9?T_CFVrN0k21kaA4Dm$k)dErT(Vn>v zKqEi8hi3vjXVY6z4n|?!iTY*#G2+Huh(S0x^<^A#(E}(ChgNBcSSQkj?W}wG2g24` zHO=%;u}_W&?_>QK8~fe$wY;El5Y)z}#Lih!A+Y=Q<;=Njn;R-W-<_Y#Ek}!|rl;Y3E8KV;iN|6>?H&GqmarcThpa}4zv%{{G_5p)016Nn#W#ar0m#)vsV@tVWNb85Lb8=a@fMrchfem!;+rP<&x z)2|k5q)VQ;%KT$tyj@NFWz^q`p&c*@O6M&qnqJrZT5z#q0}0Px`0+7u-Ba=~kzWm`?6-QEt+l&xjAJ)0Mr#HF z;4<7Z1J33%n%BMY8_WqRynF)|A@XO2c_D3wyaUay8bwci1nLAt zL`A*zvs_d=*e6%L+}68;lN0ZDpIG}Kafg1DU1O){px?ey_aQx2zGN`mrg2_=NS?%- z6b_#@U3!E&jdllK5y>xQ#|{Tf z8{@pZVRi&l^y|jbAGKkv+fh3GareH(yt!(&><+=Go{Q7FzN$y!{Xu4)N*90HIPn(8 zzg;?WUtALev#o6KuwLwE!I2%@*NvqZg{CjH>;_~pN4y~&5q*t=_e%j~=#~9yJf{r^ zUXoQ_lvR{L9WTF$`qkY0@|5r7$_5-*ro6c14CI3Qgq1Q!i>e*fv*Qx@HPAbNU zZO>bpA;&uSRv)zwsy|0i*I}cNrbOmSRnr5c# ziU2f|qqcrud;HxX8-NX($;CALi%JW9+I+5ol|5m(yD(nC|szCLpXC7dq7 z3)xbij{n3~M>>*XuY;f0a)}W#Uiog3B^=)Wmp$C3^-%iqjwjJzIlzBT5npV4Q0En7+gl7{gN1UGuc0q033)GQTxwC7t$2_K=rbqkMi%UKWbE zt*$H*+0kFIk`+S~7#Xt#Ofb;sNB&*i(fF}Moysa_?a_FRc`nm=pzkt4<3By|s)PLQ zLV1m*_|kHu^|g)O-!t!~e*T$e;t2sPhGBgu|Z|%|%=eE$@~I#}mWM z2N5kalm0HIdbWBj#Wa`AV-FdAZ$nnl4##r*e;f&ZIgAq%m6SB!H7&qDddhH|8P9%^ z75F{#C3dpygE`wB@4=c!;T4qn;l2|>%5lOBDw{hn>@)EvMAnGx8fayR#J1@MEL!+x&a{K-+YFU zIa#qBZ~WT4)ZY?<412G>V5kf?OH}dUl=6!_ILjvH1MweYjz7M?W-o=s%Lo5mT5wr8 zu}aXo;TbsDXNGbU!-Nm2J=&Lq@@UyP4bNd243W`~e9z<}HX>Jf& zv+26Nh=Hykr*ie|Eow%|C6@GaIp^i-n>$Mi!mDjCF9zeHVbXb-xO#du;T2d@=}%hM zVzF`{|6{=X!OCoi|A7FPH<{e~i=`j6BktX@0%?tM7kxqypIVSgs*d%rX)3j~__x4ULPk2pp=R`Ry6fNvOE+yRuwCc29+QyN<&xEAj z#ILK8_ak#eDRBD`_ge#%r3}==!a3-Sd>3PHXl&o%hly`ISmx@^>9b1}%WPIk8{5-l zLYd5UCW$XrvqW0j{-Y$(&r~~@8FyCx`h2JW0V8YAyr}Hnl@i*VAwdodcMRm`k=&k5 z!bK6&!7Is_G5ENjD7C@4Ux37|o3TNr%F^L*d-~+hsc*q55k}RaQT-F?Jd`Ho{ltfRESzi=IV#^9pqKqD}#MX)lyhXK?T2*zk9i{Wm^lb ztYWk%DCC*l(bB)LH*R+FWF2xHA7F3D2M0><#*`IKm|c&37D!u#YVjM3zTLi@sBcvGA8$&yE?U-< z^8R(Awg6{Ome-qU2wupG1`>?SCBtn56VUFxnLYh3EYH)0sg+#+RGj!T1MhO8r`X!+ zpZI>x#5c7`_uzGHfVT2@YC~TI;RC3ux1A=Z98Pl`hv7^iV07_FxdjINKTNAU?)Ur& zG$zY+_n*Ry-L1jf7m+ef8Jwm3{X3{Nny?gc&r;=84$}AtB_b?PFgw>FhTRjuG{>d(S zAT`GUGLDKhh5QkvGjNg8Vlb`T+ZW`x{y9J7Z4)8Yx_4d!K0J`1O`b-*_I@p9H#T1- zU4>BGF-Uvq@CvcooO>ZWeqfj6RW&(jen2MUwLr_3r)dz!cEIZ^O}wy7=IM7}=DsB8 z?MK7#UY>w*NsRi{`B{y0M*Uv%wBJ}1yHvKU{6*c#A*jA;$FRe7%={ox&~34~WjT{r zP-+FbKGIN?m(x;-IBjHk66+~tS4+Lryv1JXGcbeG-g<~A>biH*T@m0lV z16Oet+qpDs&a^lDQhqVuE3TR3zR|L!x(&9Ux=`dSj?Ea7_^$pfC4#h8ouQ3 zZRp}to61B^TDGaRlJ>sQWKpbb!{KXBsheO@k><&1vr-!E@Fnl}NB?wCtwr{orhmO# z4{U*dO#Jy6t!c>eayBMI0K)HS;2G>GH-bjkSd>^u5s0421F|@Re@u}cc3;?rXwpWI z&ic)o-ecgjc`y~FZPoPNuZcq?d6$3;2Rs<5M`z(oT~FJ4ha9n%<^90D9jdF`z2?wQ z=i^fAroJY5*{x70Y-X+BCPeN({DDOSRO|BDt0k<^620%iZ$ty#85c!?hG0NP3TbZA z(VFknV;Ky@W;g*)*dd$Xu;Z=eP)nhri^ou}jQC!bFk>WLqiMkPaVoXT9f7iUpUv3l z{?I@GxF-Jt(=tyLP8(N#@yDt*r#MF`3R6RzLu99u!&Wds5*@&=1pA+fu@vHZ3b#|*c zic24VZc7J+7&~JQTf(8*XK;OK@LzH+g9^dFF21@y_Qg$|_TDy9Iead+I&(j553BRv;D3FoG^uMAYlot_U zQ&J+Z>izT0*uR;x!{cMM%x3ypLxC#4@zD?`zX@aDkAqZwQE7z_0#B-{GZYF3R=n&Q ze&?+J>UL0Qejhq!x%0QJkF34#`FyV%&2QS_spf^t(_P<-CPSJyV& zhG)%>lH7Lbv>gtC<7oeQBfcZ*9Y&NYPwX!n>CVNFYPt}H93|mSdDLJ#vtTZ<&$6Kq zJV^ePdx4wf+qmCLU3yn<7`YvNH7K|`n0=3Q0qoSov+g%}vn{%&sX|me<*?JApd6g%&U5}G~l&?rBGl~}j6lPQPb7h{n z0Fp-)JH`4v!EGHnVkEG5H?6@T>M$h}AejEBz%OMEPIp`RhToWkA96^>onm8>C~Ru- z_N`&~mm^=%nx7eS>ZY@!yjrepGXb>YSDC1Ze2c=X#ZI)!q@(q6y5^C8_bgqWtZ7VY zH`qGozT3dMdl{cYIy%AAU`kAVPdvqlP%0XYplOx4jZ!HZ3 z$Jk%RRm&e!`I#;5WctIB(oCNU$W}H#vNXT5+F-hl70C;*7kgnr62l)rG$k#%f~g z7F%p8EK`*=h>_CD9z4%95LXMUxcECe94Oi{T$yZ{BLZ1TfeUE<~(Z=iDqD?R=X_Rh1S0$wQqr`=0Ye()GxYa5w+=lTyn_6 zJM*zuG2{^fd8@3|@;(j5J}|63qLOiwel?%bG-KD`>-#&T80w%r^}&Ss;u?$ribc|U1yx%OPrZXYQaPdyaf}kNdG>`4KoX5ox~v;nn6?Go^|7fj8}IpF@7<91 z`wguy3kOg?*tfg?z_3va)l^pxt9-j5dfgI)-kmMZqr`(;FC|Sv4EAUbiD*4SuEL5> zO+#vo-wz{5HHt~JaP=>KTdKR#<)+6Yo%#m|j`mXTm#5fSEjH_1UO@Udx4H!~p1K5W zKVOgImo|^W4XyAWuq#G~u37pXZim$i?|;GhV|iVCf2Vtp!eFNhKpRizTP{=fKL-?_ zGP6MZ-A^xfL|zR_oacXA#`1h;_b@V5jD|F}^Y(1Og`i^5%vIYz-;>VMnLwlQ#ZwMC zSBUASIWD?OcD|HPtV3x?%uRJzTuVkn9;blxA;kT1 zLcgzL$)kQN_Ac7jf#9G5zO4Fe+f zo^+BJczC!Xc+_}-Gq26J7QMmHH!w6RBUM4EYC#JKMnbw%FkN;Cvn)mrjYv*7kq^B; zi23;>68rFSd--}SUlaHFb6Mn`n8AAIW?Ht8(l*T2^(bxi5vf$m&TnrsV~r$72Fj2t z-?K*9Q45bnx@Z@qFNz~TL(#s4P2(MNt3(_)SYxDl-9DItFl63NxZ7*|9nm+0)C9@R zKX~UD28i%1=ArkgJ>7`ZlVrI5V1{Z(D<)Jpmu=;H9R81pJ%Qe>3r3!%$9a$Tq|3Gi zb>uH$@aRH*hiAXehd42^P>Kfa*KxmbPU?Id%XoD!Q)7gz2DH9zxP8~V|x&yqLi?R=ig{OY!WV6n9#{^Aly z(5Wl>*sRZ>HGdAXqkp(ne#JzH)7HxjedN-)83ogRO*cCkEBe*m@^cg=S6W#R?|Zyt zu5y|0CfvPp%MF8tdbwHegn>fy$(}Gg%7J`PxyHncy7kom#;|4-b6qz7t2XQ9l_Mtl z5z&Bjl(Enmebese4lR)i@tv26MmOXDyj8zbOjNex(Qz|1f#Q`;mL$d{kqx~T5YQJ9LcHQrnV+f)kRnFbhI^xVIym}QP7=+0?dyHQM|c|fCNS&| zXazb$nwxFTBV`=k1x!chXzs+|;wPvi%{!No#|}eq)^NN2=Yx`7Cedhf$z)src%Uk+ zZlLQ`5enrj71&F88@KNy6NY)m!YUmVS01*eea!VuI-n1ClRkIjrCrOJW~1;3jfrlo zcb4CAPWUg$i(I$BZnNuu&Cgb=Aosq%<^%BW8E1ylXlkA4egKoa_4&(#ng3$HRfcyY z_IU?!o*c`XK(_EW@1uryP2#U*SGs1^s;-`#h_`8>BbO(n{7!DPQTZqkN>_~%Gljnu8Q z-sV!RJmH&RWbT5~r%Q^SCWZ68roU^RV7tTXlWEb3VX9m zUm;!3V|ui7td_w=|4O31pF7Hwm6OlEU1TUL=*O1!bqBLxa0c69PuM*@v}GWrb}LZ%;Pd29 zTu_n0B7WC9k%yx%Z9(ZGc|o=>d>rYCgma@5k3U8}Y74n>yBkmuL_XFfk%s2js-x|W z%qaX;pUYh=YPZFt9EC3)tu=5$V^Zoy>Ad}^Tiefd)izq;K|&DD(hdRs%DfG{@Wom3 z2Md#(<0hy5Ricq!^ClbB!GVJWRuebx)t%=%Ud=vOrF2;v1|aiU6Trd_w`1k1=X-h_7c1GX0^{XLzwEXg7(K|0oym*v-dl2(v@_T7 zRa`#PH1X0oT9RO4r8M@mQ$<`ZadcZ4QIg*$!$W5D{E{=R<=(k-21-MNG+O;S#ZuXr zkGu#vk>zYYgE<>~w+c0GBdKM($P7*!zM!Cub@EuJNWFy1o><*oG_Q`5? z4&FJgoD3COZa)b?MHxH4uWBpiXloYnL7_#1imq{{vur0>%ND0Sn8=T)IOFH6#yA@= zX+ISY^F*r<0ij!XO2@K0TZBqNi_w$Nlk9-$EHgADkK6r*lbzd1x^=hy)5J}JyK12k zS@ck$bSan$r}Ap-(uIx8cy!+cz~G)(+hr_;`U>Z;P&-x)+-71#kZ!f?SiOC?di+b)REw~a~|Ayug zU~Ykm^rd}pO&z~A_yhoSyS+V6h*-{n(z4TH{+oMi4~vCgRs z;pD^xnon8-o%n>mQU!G9Tl*Rb(&^h|6G<%_H=@KoR6JAeeh7-!UUwTlTYx^*;9v!5 z(iXqTY;Z&RO8#`%Hy6m7BXgue4IfU+NhTZ~{Z0GS_dgFZU45g_C@`fVEUwZ2XNcDw`X> z``s0qnHf{bOt_3s)41ICE!*FMf-uj2=QAh&K`r)r@9zc&E|@`J);#peCNg3Yc6j{- zmc%O^+pKHs@{9bKc}8oB@0L(&?p7 z7DWQ)f-M)l3tX-Sw}YAthIJ-) zPg6RNPv6Z9i+=T!Uw;^qQ>uvqn5-tu;5e*gp5x#Ws^EPUpHZy5NgM2kW8c38Q4kN@n? zoYbe@@1ZtVx49!d|IQ@P3h2EWX)@zv0Lv^m02J6l_qPo>RfF?0hBTx;Deh%rnDJ+5s2IDL0`St zYa7gUQUke7Od(fmX~NNf@~`_WRj3hUH>A(?Ww zN11PRs3k9@S!9z40VvVhrH6@zvi8l7{)*B;Pa=o#TW{VKa)$~S0{QUUlFw?8`-tdl z|G(n^`Uf}}>#75)Jj0HbmU?PS#v_%&?B_ARt;N##0Ed)HSpwm$i?gS`ZBX+_Ru78Ot z#<%re^jiR2tqP$%GpjwTaG(M{x24Vx$p1Ip?3cp}qWGmgV!6RIg3Y^-@pCHrRpKW# zcp;er5yi=QO>&q6s~?)`i(IomVK<7sO)|4H?3xe4a6onWcRWd6b2?j~e9`ahy1SpD zG($V*$>m?|2sN2p7R33#e!=gdZs(b=ffLr#5t=^X?J0d}oz4HXdu9Day}HIR?7N?A z7#Hbhrm|39eg5^G{~XmfQHp!Gs4mxyIYa(gzMt$GeN+(MdD8#m=(+=;{{R2Us$_i3 zY^lgRE1NSTgt9l;duDUCP-gb7kj(6HTnJ~cka_mz?86=Rdw+lb-aqegulMWqd_LB* ztyJjoa==LDnqKLpd$Z>NBPiL6X%NJgHh9aMT$=l@Ts=^oel*m-26xEBjZnH1$j=&W z6S#uy5rCh{dvH?l3oGe|zP35?-tZU?TunO6dr{44W*_RAD`iL4rMSM8>z)BjOW+R< z{(f&w#ta|W8$15&{BheQc-rN~vBY!9VG7Mh3~jtt^8Hq`3mmHV3qBM^Xo?JRVSutA zh12zxM`bS?|2MUNI@u4&>Zd;kB+hp3*nXHiI&iY{FK(D;ne%OtoY*Jl_@}ePRl3}* zdy&QFf87wEe~e4p^a$|jZ~2s|_AP3^qG5T|-N{(+5W#iFFoO+iJjG=4=a`Su)_dFytn2BSQL zzC6uA%}hXAh#?-TCHHR&Va=vryvtqx%8AtvPZj`;Hf(Xz;OHz62c5Ez>jiStX0 zo245@(Bm1}d^buov1~Pho~a&smko=*IR^y)!O>Nhh3x|vyf&PP!2?F`vuos`S+d^ z{y{(5>~RSIf+^GmDXRDPvFZ4e`PNbi-oVl#v9Ek2`^_f2w)i9;ARA+cccs)gY?001 zJywE9i6rZoE00*`xQSJopEKygXMP@ur4kF_PKZ9Men_j>K`($ zF4@>R_ZNiBLVtyde4NU3s-WY3*;Ck>O38J>6qm}?u_SEkhV+b!VP-+{FA%dP^DcNE z%hL~`UW*(IFIz{D*whnT*z6$Q<4!pv)7k#_P7#UUCVghq(^vbvM{nhB(PRaA#%JDAFz8;~NuGrUQj^Q-S|6+P^LgX|s4f zUR?W0W4UJ0r<;yopX`D;F6?TeeoRv&&&@UI@CGtaM;a8G+9K0xGh-A%_MUEb%rbTg zkW)8K64{4dq(_h@&jVeq#y5dP9c-^5(LxDG;4prhhdJB!B^OZtq;rB%`jm6q>YF3$V^*dmHYo|lTHTTCsyoHeBixXmzei-WQFjdnUs|3vJIEqW+!Tlmfeh_{;m<-cN$RLZvT}oXf(J+MyVb zt)CLs%$5GG4gB|h1fAN4UW_K4#4fUwk3v>NKN-9vWq2gu{Z;$E``)Cm9ZBlcO7j4< z0Rt2Kpl--Ul1T~`yo=JD;VQj^2I6MGsTrqhR z@63j6lOjhnoRs)Feu=;|(-4T&T<~V>o=3M6*`hraYwOsTkTs3i^HiD;NKK3J;XF5^c}_#ouKV0^j*jOMviye8m@)J)ZO5 zZAlRMV9e6Gkn5scvl&Z?<5qgnR+08q}q+0|^CMIFJ1A)U!igK1r7TCJAnV zBL9GZ2YR|9yrS1znau@PHZfwhfU`cJC&0V=z#|RMwXV44c0e{;RPUmzMDp0|Zh@e0 z#3LYu6h$}ZpWiTF=7t1+yH*Hb*4Rj(d%!Onl2Mt1Ng{<24<&_)H zND|Toh|{U+?)#yl03=Hk%_vKZDV`Myzh+G}hyqyC$_Q*=yUU}eofNek)nCQ(*LMtmYn@|O469JJ@77V&+C zzv{I5iOOaZw*8zXbh|icJ#w58V(3*?RTUz&n%kvq?bWjM>jY`j-?hPP&!2my zA>njMA2IrVkn625lZu?@H+9A32#dXugo6(tIj4X_X0`{6-$J>buP&8}6S zn2Y3ro(x|LWsu)nyH@a@5_-Zw9f~BsL=;ar8kYI~HpxpAIV|#<9vP$ne~M>nu`sss zhq2-O&pH7Mf{ztjP1kV*?B-w&K<-23LsTRws@uFeye1w%dCZnSDfM9PqOdMK@WB~; za@F^(mL`ai%8)ZMTvJ^rYHY)PAM#g8U5svf6(qC+2jQk!4_pUJJ`wNxjCq(>-yONp zGdQ1242+y#I!haLHb<`XZeu0J{*zc`o_siqMY7Dnps;uR94!Jx`|peT(<%z#O4=4u z1l^x$&I))*?DF#b{gJ?wbjW3MSBU(i1AEI0pM^H)!y`0+vBARAA`>jfDF3F7&<5xW zcas9QI>uvf)(ph=-~l^n^=F8bXFiabBl0|_Vf`0t{&zxrv(t%8=I3qq8tt0Q#4svw z`V1U)?rw(pRYkT+*_j~rt{CKhz-HSkRxtnnqTKgH{6<>rd^<1_hf)q%x}+n z=7d+5b*A>eowdGlMBhH~^zd^b<2}$M4`IK+6!nS+2}oz~R323(mxPmkGj6N)-E28)k2#aCfyYwTU5TPA#vCTnyzB zmOjv$w}H0f9iN6AFBVAsfvyD!(IA8TRqsw0+HGdXl>pBr7kS!Q@bzLvVv4Qzi=@;) zzzCtuy^0#QT;NrY*3Aw?giiqsFye{~s4Lx*&0<;7%8%Pi3!lGKDMMMpo&J#Ckb7iW2s_>&A2K+CMpOIbzIJd3t~Z6E&o-y+aY>bV=tqvmV-E-N zeJ$2kVJlLb7wYw*D7gBa^I@-$bZ1pL`okvChM!ias3~~I!!9$Y%h19}xJT+6L#)KK zD^6$mct}1700n(r7yq4A4mtuPjiuMsOK0bfn@Wk(a5}z}UvckzTQW2TFePpCoiKE4 z&_+x<8Di(pGyOnQqc6w5OvDysb3h_+M-GXZHeg z4@drgUT7+dWX1@&kos^Bv%6_^BsV8tXea0ut#FSH<0Dk%GaD)j_cPM*VF1r}X!UCK zxY-7>r}WaZ-y6&exkI4guyrGn?oYcZY;3Zo4;h?gJVTDYH6Nz&bpBEoMHMEO(&QES zX~bsh;dx+WZWa+_DV%rUiH%EAnhh;@o#LI~{U~zcp?AYX=pNfi+o^>@X+ZWiO_)G1 zcM40ZP7S~>Q?2hiBeof-S!RO-A8>PBrTyzOagc`a;xGt{fo9h0b;|`Awvn6#Xe#XL zFO>FoMsMBwzmK${-`n|1HP1?)<+=iKWv&|eCX%7}VOu+3qeJ6WpxUT{`ma)6?~~BQ zIEy`E(E4(3O`gq2xB~T0oELgt!t6D5OPs6jQZG612_-$1(E3_LTsEi?Q4W3UCnTwb zyq->m-NaO#o_&65MVxKLCY|L+MZijyvCBMW%ElUaG7)hwQO8yzeFj7$%2?!-Z0a5T zyBa%1L7;&i6Waw(DWy%Dw|%dZq{cGaMMDJs7389RH}Qz619dQzc)$2Ml@~$leIh;t z|E{JdU5Z(?K62DUa-f%YkSh5HYWFz0+%!j3JcmOJ5j^;$`-|FylH!UM&{C>gC zBuH$&YFCz)Nt;2Kn2yvR6u-)PKQM7P)B z`o7FksDaZ(Dp`SYHG(#y19AW6;G1fDgcxgZ!U4T8IJT#$i#THUwj2;VgEP!xkMjQ( zRPl%@n)^?}2jg3{Xn&u-wK=MPp~vjdCiVTmVpwZJUnLS4!iRUb*ifqmOexK=xwir& z%qPT8t-FJbpLyR%U;j?>iw@sVs9nC8Sx6_5njR*WKSarhK7*J+*ny)V1Lkz0VI&CW z47KU-R@#!)vzaAVBZjX`G450y$?05QhH$CMVr)(dt_f4b6E?wx9ooquTE=&F5&~^++$^A$Lq4g5IMU`U@>6{_E?$q`@AkPWl66j1Bjw(GBP6Uu&FUnD%!9ujle& z>hFMV)6`cb=WxJAfBb(GpfMwB-{8w0^}~CKEuiH8=|<*s&3A{Rg}A1+4!6NykP@C5 zu&W1Id6)Eqtl4rb#z33UhZJ8+sUKCcee8d*lHx)oAP{h-SuV~(G6oC zp$pI1F*C0$UO4 zYqReC(OHD+?uFN2D&0Wka&MRKa&QU}5{&3fdDC@?v2KM9ZQHKjnLL|~pqO|-0?x?H zzq9K4YkT%1b)-ZsKtOtd^l`gfywcGE`Gq!k=iS{=X0ewLXG}M> zcm6!&bV;n{OLM4oLNGc-F%>oW=p>IiBFw)F-Q6EBmWllV7LyHD?Yu=K1OG{Az=Wgl zMmL+dYz3T}_u%2Z4XqCT`yb(I8{_K}aaS){#ti8RCLsSkh)PPtoUZrBYy#-c7b($C zFKs{qGb4m(7;xeGJoLx+qpC1U<}pS}fc0v!M87i-MM6(Nc3L_M72bP7T( zaV%$h&$H_|yFbqK_~o3QxEf1nup!H$BnQL-!VaGoK4vF)BH`tAtwhe*PqbduJcj`|q~6r44@$JIrDqV~+6(0K1)2^x<$-}z z)wBJk(G~M>N0eGA0Wih8JR{=kqWK5}1R_npw=wcl%+EkU&O#LKs1@28pma1R#9fF{7JT6LDv6VGv`v3``ix(q6@9e! zF<)nsl&WkHk`!uugwv3Jb!yV>twSn8yPu){>~R4&^A(p}R8l63GjWl@?dY22@;}WY zygj#oB?)IBJq-)D48r?I(n4G%U9aX4930`(|8!*~}bL=7dRIxt&zR zatYJ4Jlk*Nse2AQofO3~y}V~9KoKy}x)w~nosPUe0t7==f1%O*c!n6~JwX%5Z$W}5 zrCYa%r8f4-$!PJ%<;PpwlS%IRP!bij!`ArdmgDKb4f`X%*gl4!cX+Q8s?kFi2}s_4 zAJ@;Hpl5&HU9X$5W*i2LRF1@Uq2AB9K4+`m)IKHTp*W(e?{1IuUm4OWe2!}KNXhf0 zZtVImo#b90SbCGywkRlNv31wNh8HR~S)tBvcwsJqYiW*coDh6z)xKCGJ(}Ut&prSg z#FxnX1NQ;u+(TU3#P6#X>^`76|6kBte(b3g zn`wPd`yiet7jbXGMM?spk{B>~o3RO(yI6Y#wh2Ht9j~-_u89XsRg({9U>9rCy4c*z zd1H0RA~Nr-mN2ZA>R(0BO8^5@><1PKerb=g-%peb^twHj;=HY5lG%QA4Odxy0>A^W zb9PwVUyVI%z50avqC?w}Y=O{-Jcv%L56RPTwDaHfskQEeA3|@`QvgdEZPbO$!np%2 zU&>_493DvE!zya-0RgjP1?@QkZU)o6gx9h`up{!_=zN%}Ap^B&FRw2((oiBI3=^*2 zStwCofc!PhQ_o2UdRgwfs7_aMJ6}+q9MFTaV8)vSn<1Pv(%zc>3&N%VWYw(Y7K%-- zT$1KCA?8%WJ6Y>>s`)}*W}mMp{}>z64sPoELOz!HCN`>5kHr?~U$+Yc6bt;;cmw7f z>o>C`%1I)NKJz{ne|vZQ8ku?#1f?bDMRG{R9yu?RuCHZlr6OfEd%UpS+xJUV^yqsY zjmtRB;I9Gm=$q@hZ(U-|hi>yS_ZAxezn|rrIqEl#5CdN9RyX_Hs;hmMoaXZ7IpOM? zA>gR}pc~rZtQ*?ss>^~D=FTPGu$?WAtF0XD5`?5m&md`F&{xe&GVSVsG%;nJ?tG9d zA!w6ph-kw{t;mvrNemZ!9eL)Kx-b)>dbEr!w+v#+^i3HWNu5@);24wIb;_P=R}~2P zdV6J8Rs{$F7Ea!?+GQ5TBTce+tTup3WO7h_q}Tp`p*Or+DBH{#GKjko)IV+dUPH+> zKF`Kx8C18Reh)Xm%qaT=h%RuK@FCcbLw^9L05$asKqlwf)mxk%(ev%yK=``4@%Lu@ zk;Im)!U9Sx0WiXTce@$7z%KI!ALIbudSA8;DE`7Sa_9(pq3FL*z=GHm$Q}N)BQ6)M6>39U5uR{iNUHBhm za(6d)MphXDhBpA*aQ)Pjn3NUp^aT*<`c33vn4<{b50iGDmI9(qs=th2W(RR&%lRNx zugnjuP^Y80?4|5E%pgnalP9^P=vE`VF1nYD%1Ux+KkmbhQwc(7E?;+0vBEl(5c44T^L3u)V#lti58- zKuZQ!rgd8;?RCH+;dN=!Dzm$9Jt$RaajG`Ac*YR0oFg{)b2I@~C`J@%cE3%W1#9M- z1OEsAn(|XX8e*q=1iMWTvSX`h(B-eSBLk@lLNWDe2bF(@owAqi$+=>YzG9iC;$P12 zvV_~Vu{YH`*dBFJn29E-%oF09qs+(-WSZhFGQDfUT4*&9@kbXL{5!q9vRIxt`7n8_ zkId+AgMvOdG~C7f=AqHHjGGq5&e8pdmRDK~SHmYvi!l&+XF%^}W5q1s-=TSIOvUn% z7|M{_i3NqZs2x+r2#*AS_p zTow^dsNg#JcO1?OC=z+`r-8smwoNJf3czbXdVu82T8ic70iLg|0;C3pOyp=X6^8GXZ`5W=Rug(N zS?5I7Le3#`;L}a{6js1%o_{~o(jW*|=}a5onTyc+5bxrePBy*);Wg^4C$ zSn5&0)Z&g=^FVHALdR~KTO4AH*Dj5=Zuo?!IzJ{VltjZAC9WHTFE{cKo=cVvL`)lT z^Cs34<%@EW^z`88|AXwr8L4`|6Mjc~tDf?vkeMQ2TQDUptz?$@jDKOBaLnR3VkcKK z-sL!AyV*bdOsXxCBCtASgk&36YOsME?So2vNG)U`C&R5SZ7G{O;K(bK`OS*PSqu$Z zW$IEHM7D{4lHcSA_Y+#S=S%qw0({O>5a^j!=&C8AXYx7l|I|@MVe%B%-0tv`d7+`k z8{1_4#H*eK7Yf^u%Omd-^OWX5G-mb3-~1-oRzKAZLX48RAA)3mOdn!$xBL;I#dMw+ zONjVE0Je_G_{H^zIGJ$PJgCZL8D?~OxWIX#YwAG&`mM1+JDTso=0>k>B3xQ)@Bb>o z<3V6d87D|AA±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

hvaT8Qfu(@EJKimZ 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 z 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 From 27a9da19a16216da042b6fee12da105990662c96 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 3 Oct 2022 11:27:50 -0700 Subject: [PATCH 33/41] Remove touch --- templates/todo/api/java/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/todo/api/java/Dockerfile b/templates/todo/api/java/Dockerfile index 5e46c215531..17a4231e68a 100644 --- a/templates/todo/api/java/Dockerfile +++ b/templates/todo/api/java/Dockerfile @@ -8,7 +8,6 @@ COPY .mvn .mvn COPY openapi.yaml openapi.yaml COPY pom.xml . COPY src src -RUN touch .env RUN ./mvnw package -DskipTests RUN mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar) From cd8df38699daea06b8dd089b7b43eea04fb88a91 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 3 Oct 2022 11:44:11 -0700 Subject: [PATCH 34/41] Update cspell --- .vscode/cspell-templates.txt | 14 ++++++++++++++ .vscode/cspell.yaml | 2 ++ 2 files changed, 16 insertions(+) diff --git a/.vscode/cspell-templates.txt b/.vscode/cspell-templates.txt index 3391a155733..6d280d7c2af 100644 --- a/.vscode/cspell-templates.txt +++ b/.vscode/cspell-templates.txt @@ -7,20 +7,29 @@ autouse azdo borderless browserslist +codegen codepaths Codespaces configfile +configurer containerapp CUSTOMHANDLER +databind +Dskip eastus envconfig ezfunc +fasterxml immer inprogress INPROGRESS Instrumentor mkdir +mvnw networkidle +noverify +openapigen +openapitools OPTARG prestart printenv @@ -30,6 +39,11 @@ Quickstart reactd ROLENAME Serializers +servlet +simpletodo +simpletodo +springdoc +springframework staticwebapp Swashbuckle tsbuildinfo diff --git a/.vscode/cspell.yaml b/.vscode/cspell.yaml index 0949b323930..8d5240534a7 100644 --- a/.vscode/cspell.yaml +++ b/.vscode/cspell.yaml @@ -11,6 +11,8 @@ ignorePaths: - eng # not required - ext # uses its own cspell config - "*.bicep" # no need to lint resource files + - mvnw # Maven wrapper asset used in Java templates -- external library code + - mvnw.cmd # Maven wrapper asset used in Java templates -- external library code dictionaryDefinitions: - name: templatesDictionary path: ./cspell-templates.txt From fb76882a2bf666cddcc09ef8afab7a2d9d33a3b5 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 3 Oct 2022 11:53:15 -0700 Subject: [PATCH 35/41] Reorder launch.json --- .../java-mongo-aca/.vscode/launch.json | 21 +++++++++---------- .../projects/java-mongo/.vscode/launch.json | 21 +++++++++---------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/templates/todo/projects/java-mongo-aca/.vscode/launch.json b/templates/todo/projects/java-mongo-aca/.vscode/launch.json index 8140ef611fc..4127d5eeaee 100644 --- a/templates/todo/projects/java-mongo-aca/.vscode/launch.json +++ b/templates/todo/projects/java-mongo-aca/.vscode/launch.json @@ -1,17 +1,6 @@ { "version": "0.2.0", "configurations": [ - { - "name": "Debug Web", - "request": "launch", - "type": "msedge", - "webRoot": "${workspaceFolder}/src/web/src", - "url": "http://localhost:3000", - "sourceMapPathOverrides": { - "webpack:///src/*": "${webRoot}/*" - }, - }, - { "name": "Debug API", "type": "java", @@ -22,6 +11,16 @@ "cwd": "${workspaceFolder}/src/api", "env": {}, "envFile": "${input:dotEnvFilePath}" + }, + { + "name": "Debug Web", + "request": "launch", + "type": "msedge", + "webRoot": "${workspaceFolder}/src/web/src", + "url": "http://localhost:3000", + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + }, } ], diff --git a/templates/todo/projects/java-mongo/.vscode/launch.json b/templates/todo/projects/java-mongo/.vscode/launch.json index 8140ef611fc..4127d5eeaee 100644 --- a/templates/todo/projects/java-mongo/.vscode/launch.json +++ b/templates/todo/projects/java-mongo/.vscode/launch.json @@ -1,17 +1,6 @@ { "version": "0.2.0", "configurations": [ - { - "name": "Debug Web", - "request": "launch", - "type": "msedge", - "webRoot": "${workspaceFolder}/src/web/src", - "url": "http://localhost:3000", - "sourceMapPathOverrides": { - "webpack:///src/*": "${webRoot}/*" - }, - }, - { "name": "Debug API", "type": "java", @@ -22,6 +11,16 @@ "cwd": "${workspaceFolder}/src/api", "env": {}, "envFile": "${input:dotEnvFilePath}" + }, + { + "name": "Debug Web", + "request": "launch", + "type": "msedge", + "webRoot": "${workspaceFolder}/src/web/src", + "url": "http://localhost:3000", + "sourceMapPathOverrides": { + "webpack:///src/*": "${webRoot}/*" + }, } ], From dbf6c767e2bb2fd444ba3c95ae3eff7fa8a7619f Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Mon, 3 Oct 2022 14:19:03 -0700 Subject: [PATCH 36/41] Add back rewrite --- .../todo/projects/java-mongo-aca/.repo/bicep/repo.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml index bb9825a206f..b88c0e7acf0 100644 --- a/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml +++ b/templates/todo/projects/java-mongo-aca/.repo/bicep/repo.yaml @@ -39,6 +39,13 @@ repo: ignore: - "**/main.bicep" + - from: ../../../../../common/infra/bicep + to: ../ + patterns: + - "**/*.bicep" + ignore: + - "**/main.bicep" + # main.bicep - from: ../../../../../../common/infra/bicep to: ./ @@ -157,6 +164,9 @@ repo: - "build/**/*" - "node_modules/**/*" + - from: ./infra/ + to: ./infra + # Azure.yml - from: ./azure.yaml to: ./azure.yaml From 12d7faf89cb0cc0a7f5fedae32e7220429e9985b Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Tue, 4 Oct 2022 11:49:22 -0700 Subject: [PATCH 37/41] Update templates/todo/projects/java-mongo/README.md Co-authored-by: Jon Gallant <2163001+jongio@users.noreply.github.com> --- templates/todo/projects/java-mongo/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/todo/projects/java-mongo/README.md b/templates/todo/projects/java-mongo/README.md index 7378abe48aa..ffadd601cfa 100644 --- a/templates/todo/projects/java-mongo/README.md +++ b/templates/todo/projects/java-mongo/README.md @@ -1,6 +1,6 @@ # ToDo Application with a Java API and Azure Cosmos DB API for MongoDB on Azure App Service -[![Open in Remote - Containers](https://img.shields.io/static/v1?label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/todo-nodejs-mongo) +[![Open in Remote - Containers](https://img.shields.io/static/v1?label=Remote%20-%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/todo-java-mongo) A complete ToDo application that includes everything you need to build, deploy, and monitor an Azure solution. This application uses the Azure Developer CLI (azd) to get you up and running on Azure quickly, React.js for the Web application, Java for the API, Azure Cosmos DB API for MongoDB for storage, and Azure Monitor for monitoring and logging. It includes application code, tools, and pipelines that serve as a foundation from which you can build upon and customize when creating your own solutions. From df53ebc723954077d6b4639069fdec30eeddac7f Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Tue, 4 Oct 2022 12:40:10 -0700 Subject: [PATCH 38/41] Update dockerfile --- cli/Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cli/Dockerfile b/cli/Dockerfile index f701d4f0b37..afb7a0dbeed 100644 --- a/cli/Dockerfile +++ b/cli/Dockerfile @@ -31,6 +31,11 @@ RUN export DEBIAN_FRONTEND=noninteractive \ && echo 'alias python=python3' >> ~/.bashrc \ && echo 'alias pip=pip3' >> ~/.bashrc \ && apt-get clean -y && rm -rf /var/lib/apt/lists/* \ + # java + && sudo apt-get install wget lsb-release -y \ + && wget https://packages.microsoft.com/config/debian/${lsb_release -rs}/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ + && sudo dpkg -i packages-microsoft-prod.deb \ + && apt-get update && apt-get install -y msopenjdk-17 \ # terraform cli && apt-get update && apt-get install -y gnupg software-properties-common \ && wget -O- https://apt.releases.hashicorp.com/gpg | \ From 8408cd7a002568eb3530d7e3fcd0bd4fd573c996 Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Tue, 4 Oct 2022 13:06:47 -0700 Subject: [PATCH 39/41] Update cli-app image --- cli/Dockerfile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cli/Dockerfile b/cli/Dockerfile index afb7a0dbeed..b55c04f6043 100644 --- a/cli/Dockerfile +++ b/cli/Dockerfile @@ -3,7 +3,7 @@ FROM mcr.microsoft.com/dotnet/sdk:6.0 WORKDIR /app RUN export DEBIAN_FRONTEND=noninteractive \ - && wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb && dpkg -i packages-microsoft-prod.deb \ + && wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb && dpkg -i packages-microsoft-prod.deb \ && apt-get update && apt-get install -y --no-install-recommends apt-utils && apt-get install -y apt-transport-https ca-certificates curl unzip procps gnupg2 software-properties-common lsb-release \ # functions core tools && curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg \ @@ -32,10 +32,7 @@ RUN export DEBIAN_FRONTEND=noninteractive \ && echo 'alias pip=pip3' >> ~/.bashrc \ && apt-get clean -y && rm -rf /var/lib/apt/lists/* \ # java - && sudo apt-get install wget lsb-release -y \ - && wget https://packages.microsoft.com/config/debian/${lsb_release -rs}/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \ - && sudo dpkg -i packages-microsoft-prod.deb \ - && apt-get update && apt-get install -y msopenjdk-17 \ + && apt-get install -y msopenjdk-17 \ # terraform cli && apt-get update && apt-get install -y gnupg software-properties-common \ && wget -O- https://apt.releases.hashicorp.com/gpg | \ From dedbc89b3f7cd7c8e85d05709be5683e5d68352a Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Wed, 5 Oct 2022 09:13:45 -0700 Subject: [PATCH 40/41] Upgrade dependencies --- templates/todo/api/java/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/todo/api/java/pom.xml b/templates/todo/api/java/pom.xml index 1bd850c025c..f24a89c9654 100644 --- a/templates/todo/api/java/pom.xml +++ b/templates/todo/api/java/pom.xml @@ -4,7 +4,7 @@ org.springframework.boot spring-boot-starter-parent - 2.7.2 + 2.7.4 @@ -17,7 +17,7 @@ 17 ${java.version} ${java.version} - 1.6.4 + 1.6.11 @@ -57,7 +57,7 @@ org.openapitools jackson-databind-nullable - 0.2.2 + 0.2.3 From 5e6f642c3acddf4927f68b4a656c04614245a19f Mon Sep 17 00:00:00 2001 From: Wei Lim Date: Wed, 5 Oct 2022 11:03:15 -0700 Subject: [PATCH 41/41] reorder cleanup --- cli/Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cli/Dockerfile b/cli/Dockerfile index b55c04f6043..46822f3d176 100644 --- a/cli/Dockerfile +++ b/cli/Dockerfile @@ -30,9 +30,8 @@ RUN export DEBIAN_FRONTEND=noninteractive \ && python3 -m pip install --upgrade pip \ && echo 'alias python=python3' >> ~/.bashrc \ && echo 'alias pip=pip3' >> ~/.bashrc \ - && apt-get clean -y && rm -rf /var/lib/apt/lists/* \ # java - && apt-get install -y msopenjdk-17 \ + && apt-get update && apt-get install -y msopenjdk-17 \ # terraform cli && apt-get update && apt-get install -y gnupg software-properties-common \ && wget -O- https://apt.releases.hashicorp.com/gpg | \ @@ -41,7 +40,9 @@ RUN export DEBIAN_FRONTEND=noninteractive \ && echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \ https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \ tee /etc/apt/sources.list.d/hashicorp.list \ - && apt update && apt-get install terraform + && apt update && apt-get install terraform \ + # Cleanup + && apt-get clean -y && rm -rf /var/lib/apt/lists/* # azd COPY cli/bin/azd-linux-amd64 /usr/bin/azd