/*
* Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file 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.
*/
package com.amazonaws.mobileconnectors.lex.interactionkit.utils;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.CognitoCredentialsProvider;
import com.amazonaws.mobileconnectors.lex.interactionkit.config.InteractionConfig;
import com.amazonaws.services.lexrts.model.PostContentRequest;
import com.amazonaws.util.StringUtils;
import com.google.common.net.MediaType;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* Utility class to create requests for Amazon Lex service.
*/
public class CreateLexServiceRequest {
/**
* Creates a request post speech input request for Amazon Lex service.
*
* @param sessionAttributes Session attributes for this current transaction.
* @param audioStream audio as {@link InputStream}.
* @return {@link PostContentRequest}.
*/
public static PostContentRequest generatePostContentRequest(Map<String, String> sessionAttributes,
InteractionConfig interactionConfig,
AWSCredentialsProvider credentialsProvider,
ResponseType mode,
InputStream audioStream,
String contentType) {
final PostContentRequest request = generateRequestInternal(sessionAttributes,
interactionConfig,
credentialsProvider,
mode);
// Set input and content type.
request.setInputStream(audioStream);
request.setContentType(contentType);
return request;
}
/**
* Creates a request to post text input request for Amazon Lex service.
*
* @param sessionAttributes Session attributes for this current transaction.
* @param text Input text.
* @return {@link PostContentRequest}.
*/
public static PostContentRequest generatePostContentRequest(Map<String, String> sessionAttributes,
InteractionConfig interactionConfig,
AWSCredentialsProvider credentialsProvider,
ResponseType mode,
String text) {
final PostContentRequest request = generateRequestInternal(sessionAttributes,
interactionConfig,
credentialsProvider,
mode);
// Set input and content type.
final byte[] textContent = text.getBytes(StringUtils.UTF8);
request.setInputStream(new ByteArrayInputStream(textContent));
request.setContentType(MediaType.PLAIN_TEXT_UTF_8.toString());
return request;
}
/**
*
* @param sessionAttributes
* @param interactionConfig
* @param credentialsProvider
* @param mode
* @return
*/
private static PostContentRequest generateRequestInternal(Map<String, String> sessionAttributes,
InteractionConfig interactionConfig,
AWSCredentialsProvider credentialsProvider,
ResponseType mode) {
final PostContentRequest request = new PostContentRequest();
request.setBotName(interactionConfig.getBotName());
request.setBotAlias(interactionConfig.getBotAlias());
request.setAccept(mode.toString());
final Map<String, String> newSessionAttributes = new HashMap<String, String>();
newSessionAttributes.putAll(interactionConfig.getGlobalSessionAttributes());
if (sessionAttributes != null) {
newSessionAttributes.putAll(sessionAttributes);
}
request.setSessionAttributes(newSessionAttributes);
if (interactionConfig.getUserId() == null || interactionConfig.getUserId().isEmpty()) {
final CognitoCredentialsProvider cognitoCredentialsProvider = (CognitoCredentialsProvider) credentialsProvider;
request.setUserId(cognitoCredentialsProvider.getIdentityId());
} else {
request.setUserId(interactionConfig.getUserId());
}
return request;
}
}