diff --git a/samples/servlet-echo/deploymentTemplates/template-with-new-rg-gov.json b/samples/servlet-echo/deploymentTemplates/template-with-new-rg-gov.json new file mode 100644 index 00000000..d5264be9 --- /dev/null +++ b/samples/servlet-echo/deploymentTemplates/template-with-new-rg-gov.json @@ -0,0 +1,192 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "groupLocation": { + "defaultValue": "", + "type": "string", + "metadata": { + "description": "Specifies the location of the Resource Group." + } + }, + "groupName": { + "type": "string", + "metadata": { + "description": "Specifies the name of the Resource Group." + } + }, + "appId": { + "type": "string", + "metadata": { + "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings." + } + }, + "appSecret": { + "type": "string", + "metadata": { + "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings." + } + }, + "botId": { + "type": "string", + "metadata": { + "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable." + } + }, + "botSku": { + "defaultValue": "S1", + "type": "string", + "metadata": { + "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1." + } + }, + "newAppServicePlanName": { + "defaultValue": "", + "type": "string", + "metadata": { + "description": "The name of the App Service Plan." + } + }, + "newAppServicePlanSku": { + "type": "object", + "defaultValue": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + }, + "metadata": { + "description": "The SKU of the App Service Plan. Defaults to Standard values." + } + }, + "newAppServicePlanLocation": { + "defaultValue": "", + "type": "string", + "metadata": { + "description": "The location of the App Service Plan. Defaults to \"westus\"." + } + }, + "newWebAppName": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"." + } + } + }, + "variables": { + "resourcesLocation": "[deployment().location]", + "effectiveGroupLocation": "[if(empty(parameters('groupLocation')), variables('resourcesLocation'), parameters('groupLocation'))]", + "effectivePlanLocation": "[if(empty(parameters('newAppServicePlanLocation')), variables('resourcesLocation'), parameters('newAppServicePlanLocation'))]", + "appServicePlanName": "[if(empty(parameters('newAppServicePlanName')), concat(parameters('botId'), 'ServicePlan'), parameters('newAppServicePlanName'))]", + "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]", + "siteHost": "[concat(variables('webAppName'), '.azurewebsites.us')]", + "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]" + }, + "resources": [ + { + "name": "[parameters('groupName')]", + "type": "Microsoft.Resources/resourceGroups", + "apiVersion": "2018-05-01", + "location": "[variables('effectiveGroupLocation')]", + "properties": { + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2018-05-01", + "name": "storageDeployment", + "resourceGroup": "[parameters('groupName')]", + "dependsOn": [ + "[resourceId('Microsoft.Resources/resourceGroups/', parameters('groupName'))]" + ], + "properties": { + "mode": "Incremental", + "template": { + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": {}, + "variables": {}, + "resources": [ + { + "comments": "Create a new App Service Plan", + "type": "Microsoft.Web/serverfarms", + "name": "[variables('appServicePlanName')]", + "apiVersion": "2018-02-01", + "location": "[variables('effectivePlanLocation')]", + "sku": "[parameters('newAppServicePlanSku')]", + "kind": "app", + "properties": { + "name": "[variables('appServicePlanName')]" + } + }, + { + "comments": "Create a Web App using the new App Service Plan", + "type": "Microsoft.Web/sites", + "apiVersion": "2015-08-01", + "location": "[variables('resourcesLocation')]", + "kind": "app", + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms/', variables('appServicePlanName'))]" + ], + "name": "[variables('webAppName')]", + "properties": { + "name": "[variables('webAppName')]", + "serverFarmId": "[variables('appServicePlanName')]", + "siteConfig": { + "appSettings": [ + { + "name": "JAVA_OPTS", + "value": "-Dserver.port=80" + }, + { + "name": "MicrosoftAppId", + "value": "[parameters('appId')]" + }, + { + "name": "MicrosoftAppPassword", + "value": "[parameters('appSecret')]" + } + ], + "cors": { + "allowedOrigins": [ + "https://botservice.hosting.azureportal.usgovcloudapi.net", + "https://botservice-ms.hosting.azureportal.usgovcloudapi.net", + "https://hosting.onecloud.azure-test.net/" + ], + "supportCredentials": false + } + } + } + }, + { + "apiVersion": "2017-12-01", + "type": "Microsoft.BotService/botServices", + "name": "[parameters('botId')]", + "location": "global", + "kind": "bot", + "sku": { + "name": "[parameters('botSku')]" + }, + "properties": { + "name": "[parameters('botId')]", + "displayName": "[parameters('botId')]", + "endpoint": "[variables('botEndpoint')]", + "msaAppId": "[parameters('appId')]", + "developerAppInsightsApplicationId": null, + "developerAppInsightKey": null, + "publishingCredentials": null, + "storageResourceId": null + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]" + ] + } + ], + "outputs": {} + } + } + } + ] +} diff --git a/samples/servlet-echo/deploymentTemplates/template-with-preexisting-rg-gov.json b/samples/servlet-echo/deploymentTemplates/template-with-preexisting-rg-gov.json new file mode 100644 index 00000000..c9192167 --- /dev/null +++ b/samples/servlet-echo/deploymentTemplates/template-with-preexisting-rg-gov.json @@ -0,0 +1,158 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "appId": { + "type": "string", + "metadata": { + "description": "Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings." + } + }, + "appSecret": { + "type": "string", + "metadata": { + "description": "Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \"\"." + } + }, + "botId": { + "type": "string", + "metadata": { + "description": "The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable." + } + }, + "botSku": { + "defaultValue": "S1", + "type": "string", + "metadata": { + "description": "The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1." + } + }, + "newAppServicePlanName": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "The name of the new App Service Plan." + } + }, + "newAppServicePlanSku": { + "type": "object", + "defaultValue": { + "name": "S1", + "tier": "Standard", + "size": "S1", + "family": "S", + "capacity": 1 + }, + "metadata": { + "description": "The SKU of the App Service Plan. Defaults to Standard values." + } + }, + "appServicePlanLocation": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "The location of the App Service Plan." + } + }, + "existingAppServicePlan": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Name of the existing App Service Plan used to create the Web App for the bot." + } + }, + "newWebAppName": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "The globally unique name of the Web App. Defaults to the value passed in for \"botId\"." + } + } + }, + "variables": { + "defaultAppServicePlanName": "[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]", + "useExistingAppServicePlan": "[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]", + "servicePlanName": "[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), if(empty(parameters('newAppServicePlanName')),concat(parameters('botId'), 'ServicePlan'),parameters('newAppServicePlanName')))]", + "resourcesLocation": "[if(empty(parameters('appServicePlanLocation')), resourceGroup().location, parameters('appServicePlanLocation'))]", + "webAppName": "[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]", + "siteHost": "[concat(variables('webAppName'), '.azurewebsites.us')]", + "botEndpoint": "[concat('https://', variables('siteHost'), '/api/messages')]" + }, + "resources": [ + { + "comments": "Create a new App Service Plan if no existing App Service Plan name was passed in.", + "type": "Microsoft.Web/serverfarms", + "condition": "[not(variables('useExistingAppServicePlan'))]", + "name": "[variables('servicePlanName')]", + "apiVersion": "2018-02-01", + "location": "[variables('resourcesLocation')]", + "sku": "[parameters('newAppServicePlanSku')]", + "kind": "app", + "properties": { + "name": "[variables('servicePlanName')]" + } + }, + { + "comments": "Create a Web App using an App Service Plan", + "type": "Microsoft.Web/sites", + "apiVersion": "2016-08-01", + "location": "[variables('resourcesLocation')]", + "kind": "app", + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms/', variables('servicePlanName'))]" + ], + "name": "[variables('webAppName')]", + "properties": { + "name": "[variables('webAppName')]", + "serverFarmId": "[variables('servicePlanName')]", + "siteConfig": { + "appSettings": [ + { + "name": "JAVA_OPTS", + "value": "-Dserver.port=80" + }, + { + "name": "MicrosoftAppId", + "value": "[parameters('appId')]" + }, + { + "name": "MicrosoftAppPassword", + "value": "[parameters('appSecret')]" + } + ], + "cors": { + "allowedOrigins": [ + "https://botservice.hosting.azureportal.usgovcloudapi.net", + "https://botservice-ms.hosting.azureportal.usgovcloudapi.net", + "https://hosting.onecloud.azure-test.net/" + ], + "supportCredentials": false + } + } + } + }, + { + "apiVersion": "2017-12-01", + "type": "Microsoft.BotService/botServices", + "name": "[parameters('botId')]", + "location": "global", + "kind": "bot", + "sku": { + "name": "[parameters('botSku')]" + }, + "properties": { + "name": "[parameters('botId')]", + "displayName": "[parameters('botId')]", + "endpoint": "[variables('botEndpoint')]", + "msaAppId": "[parameters('appId')]", + "developerAppInsightsApplicationId": null, + "developerAppInsightKey": null, + "publishingCredentials": null, + "storageResourceId": null + }, + "dependsOn": [ + "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]" + ] + } + ] +} diff --git a/samples/servlet-echo/pom.xml b/samples/servlet-echo/pom.xml index 8a01391e..c3523882 100644 --- a/samples/servlet-echo/pom.xml +++ b/samples/servlet-echo/pom.xml @@ -61,16 +61,29 @@ jackson-datatype-jsr310 2.9.8 + - org.slf4j - slf4j-api - 1.7.26 + org.slf4j + slf4j-api + 1.7.22 - org.slf4j - slf4j-simple - 1.7.26 + org.apache.logging.log4j + log4j-api + 2.11.0 + + org.apache.logging.log4j + log4j-core + 2.11.0 + + + org.slf4j + slf4j-log4j12 + 1.7.25 + test + + com.microsoft.bot bot-schema diff --git a/samples/servlet-echo/src/main/java/com/microsoft/bot/sample/servlet/EchoServlet.java b/samples/servlet-echo/src/main/java/com/microsoft/bot/sample/servlet/EchoServlet.java index 2c8d5587..49f13a9d 100644 --- a/samples/servlet-echo/src/main/java/com/microsoft/bot/sample/servlet/EchoServlet.java +++ b/samples/servlet-echo/src/main/java/com/microsoft/bot/sample/servlet/EchoServlet.java @@ -16,15 +16,17 @@ import com.microsoft.bot.integration.Configuration; import com.microsoft.bot.integration.ConfigurationChannelProvider; import com.microsoft.bot.schema.Activity; import com.microsoft.bot.schema.ActivityTypes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; import java.io.InputStream; +import java.io.PrintWriter; import java.util.concurrent.CompletionException; -import java.util.logging.Level; -import java.util.logging.Logger; /** * This is the Servlet that will receive incoming Channel Activity messages. @@ -32,7 +34,7 @@ import java.util.logging.Logger; @WebServlet(name = "EchoServlet", urlPatterns = "/api/messages") public class EchoServlet extends HttpServlet { private static final long serialVersionUID = 1L; - private static final Logger LOGGER = Logger.getLogger(EchoServlet.class.getName()); + private static final Logger LOGGER = LoggerFactory.getLogger(EchoServlet.class); private ObjectMapper objectMapper; private CredentialProvider credentialProvider; @@ -61,9 +63,21 @@ public class EchoServlet extends HttpServlet { } } + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + try (PrintWriter out = response.getWriter()) { + out.println("hello world"); + response.setStatus(HttpServletResponse.SC_ACCEPTED); + } catch (Throwable t) { + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) { try { + LOGGER.debug("Received request"); + Activity activity = getActivity(request); String authHeader = request.getHeader("Authorization"); @@ -82,14 +96,14 @@ public class EchoServlet extends HttpServlet { response.setStatus(HttpServletResponse.SC_ACCEPTED); } catch (CompletionException ex) { if (ex.getCause() instanceof AuthenticationException) { - LOGGER.log(Level.WARNING, "Auth failed!", ex); + LOGGER.error("Auth failed!", ex); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); } else { - LOGGER.log(Level.WARNING, "Execution failed", ex); + LOGGER.error("Execution failed", ex); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } catch (Exception ex) { - LOGGER.log(Level.WARNING, "Execution failed", ex); + LOGGER.error("Execution failed", ex); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } @@ -97,7 +111,7 @@ public class EchoServlet extends HttpServlet { // Creates an Activity object from the request private Activity getActivity(HttpServletRequest request) throws IOException, JsonParseException, JsonMappingException { String body = getRequestBody(request); - LOGGER.log(Level.INFO, body); + LOGGER.debug(body); return objectMapper.readValue(body, Activity.class); } diff --git a/samples/servlet-echo/src/main/resources/log4j2.json b/samples/servlet-echo/src/main/resources/log4j2.json new file mode 100644 index 00000000..67c0ad53 --- /dev/null +++ b/samples/servlet-echo/src/main/resources/log4j2.json @@ -0,0 +1,18 @@ +{ + "configuration": { + "name": "Default", + "appenders": { + "Console": { + "name": "Console-Appender", + "target": "SYSTEM_OUT", + "PatternLayout": {"pattern": "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"} + } + }, + "loggers": { + "root": { + "level": "debug", + "appender-ref": {"ref": "Console-Appender","level": "debug"} + } + } + } +}