ai.labs
caching-impl-infinispan
diff --git a/apiserver/src/main/java/ai/labs/api/ApiServer.java b/apiserver/src/main/java/ai/labs/api/ApiServer.java
index eb4a62598..8c5306ed1 100644
--- a/apiserver/src/main/java/ai/labs/api/ApiServer.java
+++ b/apiserver/src/main/java/ai/labs/api/ApiServer.java
@@ -8,7 +8,6 @@
import ai.labs.facebookmessenger.bootstrap.FacebookMessengerModule;
import ai.labs.httpclient.guice.HttpClientModule;
import ai.labs.memory.bootstrap.ConversationMemoryModule;
-import ai.labs.output.bootstrap.OutputGenerationModule;
import ai.labs.parser.bootstrap.SemanticParserModule;
import ai.labs.permission.bootstrap.PermissionModule;
import ai.labs.persistence.bootstrap.PersistenceModule;
@@ -61,7 +60,6 @@ public static void main(String[] args) throws Exception {
new UserModule(),
new CachingModule(new FileInputStream(configDir + "infinispan.xml")),
new SemanticParserModule(),
- new OutputGenerationModule(),
new AutomatedtestingModule(),
new StaticResourcesModule(),
new HttpClientModule(),
diff --git a/apiserver/src/main/resources/css/chat.css b/apiserver/src/main/resources/css/chat.css
index fd305a354..2a7cf22d5 100644
--- a/apiserver/src/main/resources/css/chat.css
+++ b/apiserver/src/main/resources/css/chat.css
@@ -65,30 +65,6 @@ body {
opacity: 0;
}
-.messages .quick_reply {
- position: relative;
- clear: both;
- overflow: hidden;
- transition: all 0.5s linear;
- opacity: 0;
- background-color: #ffe6cb;
- color: #c48843;
- border: 2px dashed #c48843;
- padding: 15px 32px;
- text-align: center;
- text-decoration: none;
- display: inline-block;
- font-size: 16px;
- border-radius: 6px;
- cursor: pointer;
- box-shadow: 2px 2px gray;
- margin: 5px;
-}
-
-.messages .quick_reply.appeared {
- opacity: 1;
-}
-
.typing {
background-color: #8c8c8c;
font-weight: bolder;
diff --git a/apiserver/src/main/resources/js/chat.js b/apiserver/src/main/resources/js/chat.js
index 92605da93..b16312d95 100644
--- a/apiserver/src/main/resources/js/chat.js
+++ b/apiserver/src/main/resources/js/chat.js
@@ -1,99 +1,58 @@
-const eddi = {};
+var eddi = {};
-class Message {
- constructor(text, message_side) {
- this.text = text;
- this.message_side = message_side;
- }
-
- get draw() {
+var Message;
+Message = function (arg) {
+ this.text = arg.text, this.message_side = arg.message_side;
+ this.draw = function (_this) {
return function () {
- const $message = $($('.message_template').clone().html());
- $message.addClass(this.message_side).find('.text').html(this.text);
+ var $message;
+ $message = $($('.message_template').clone().html());
+ $message.addClass(_this.message_side).find('.text').html(_this.text);
$('.messages').append($message);
return setTimeout(function () {
return $message.addClass('appeared');
}, 0);
};
- }
-}
-
-class QuickReply {
- constructor(text, message_side) {
- this.text = text;
- this.message_side = message_side;
- }
-
- get draw() {
- return function () {
- const _this = this;
- const $quickReply = $('', {
- text: this.text,
- click: function () {
- eddi.submitUserMessage(_this.text);
- eddi.displayMessage(_this.text, 'right');
- $('.quick_reply').remove();
- }
- });
- $quickReply.addClass(this.message_side);
- $quickReply.addClass('quick_reply');
- $('.messages').append($quickReply);
- return setTimeout(function () {
- return $quickReply.addClass('appeared');
- }, 0);
- };
- }
-}
-
+ }(this);
+ return this;
+};
$(function () {
- let message_side = 'right';
-
- function getMessageText() {
- const $message_input = $('.message_input');
+ var getMessageText, message_side, displayMessage;
+ message_side = 'right';
+ getMessageText = function () {
+ var $message_input;
+ $message_input = $('.message_input');
return $message_input.val();
- }
-
- eddi.displayMessage = function (text, side) {
- let $messages, message;
+ };
+ displayMessage = function (text, side) {
+ var $messages, message;
if (text.trim() === '') {
return;
}
$('.message_input').val('');
$messages = $('.messages');
message_side = side ? 'right' : 'left';
- message = new Message(text, side);
+ message = new Message({
+ text: text,
+ message_side: side
+ });
message.draw();
return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
};
-
- function displayQuickReplies(quickReplies) {
- let $messages, quickReply;
- if (quickReplies.length === 0) {
- return;
- }
-
- $messages = $('.messages');
- for (let i = 0; i < quickReplies.length; i++) {
- quickReply = new QuickReply(quickReplies[i].value, 'left');
- quickReply.draw();
- }
- return $messages.animate({scrollTop: $messages.prop('scrollHeight')}, 300);
- }
-
- $('.send_message').click(function () {
- const userMessage = getMessageText();
- eddi.submitUserMessage(userMessage);
- return eddi.displayMessage(userMessage, 'right');
+ $('.send_message').click(function (e) {
+ var userMessage = getMessageText();
+ submitUserMessage(userMessage);
+ return displayMessage(userMessage, 'right');
});
$('.message_input').keyup(function (e) {
if (e.which === 13) {
- const userMessage = getMessageText();
- eddi.submitUserMessage(userMessage);
- return eddi.displayMessage(userMessage, 'right');
+ var userMessage = getMessageText();
+ submitUserMessage(userMessage);
+ return displayMessage(userMessage, 'right');
}
});
- eddi.submitUserMessage = function (userMessage) {
+ var submitUserMessage = function (userMessage) {
$.ajax({
type: "POST",
url: "/bots/" + eddi.environment + "/" + eddi.botId + "/" + eddi.conversationId,
@@ -105,80 +64,117 @@ $(function () {
});
};
- const loadConversationLog = function () {
+ var loadConversationLog = function () {
$.get("/bots/" + eddi.environment + "/" + eddi.botId + "/" + eddi.conversationId).done(function (data) {
refreshConversationLog(data);
});
};
- const refreshConversationLog = function (conversationMemory) {
- const conversationState = conversationMemory.conversationState;
+ var refreshConversationLog = function (conversationMemory) {
+ var conversationState = conversationMemory.conversationState;
- if (conversationState === 'ERROR') {
+ if (conversationState == 'ERROR') {
log('ERROR', "An Error has occurred. Please contact the administrator!");
return;
}
- if (conversationState === 'IN_PROGRESS') {
+ if (conversationState == 'ENDED') {
+ $("#ended_dialog").dialog({
+ modal: true,
+ buttons: [
+ {
+ text: "New Conversation!",
+ click: function () {
+ $(this).dialog("close");
+ startNewConversation();
+ }
+ }
+ ],
+ position: {my: "top"},
+ width: 300
+ });
+ $("#ended_dialog").dialog("option", "closeOnEscape", false);
+ $('#status_indicator').css('visibility', 'hidden');
+ $('#user_input_button_submit').addClass('ui-disabled');
+ $('#redo').hide();
+ $('#undo').hide();
+ }
+
+ if (conversationState == 'IN_PROGRESS') {
setTimeout(loadConversationLog, 1000);
return;
}
- let ioList = [];
- for (let i = 0; i < conversationMemory.conversationSteps.length; i++) {
- let step = conversationMemory.conversationSteps[i];
-
- let input = null;
- let output = null;
- let media = null;
- let action = null;
- let quickReplies = [];
- for (let x = 0; x < step.data.length; x++) {
- let obj = step.data[x];
- if (obj.key.indexOf('input') === 0) {
+ var ioList = [];
+ for (var i = 0; i < conversationMemory.conversationSteps.length; i++) {
+ var step = conversationMemory.conversationSteps[i];
+
+ var input = null;
+ var output = null;
+ var media = null;
+ for (var x = 0; x < step.data.length; x++) {
+ var obj = step.data[x];
+ if (obj.key.indexOf('input') == 0) {
input = obj.value;
- } else if (obj.key.indexOf('media') === 0) {
- media = obj.value;
- } else if (obj.key.indexOf('actions') === 0) {
- action = obj.value;
- } else if (obj.key.indexOf('output:quickreply') === 0) {
- pushArray(quickReplies, obj.value);
- } else if (obj.key.indexOf('output') === 0) {
+ } else if (obj.key.indexOf('output') == 0) {
output = obj.value;
+ } else if (obj.key.indexOf('media') == 0) {
+ media = obj.value;
+ } else if (obj.key.indexOf('actions') == 0) {
}
}
- ioList.push({input: input, output: output, media: media, quickReplies: quickReplies});
+ ioList.push({input: input, output: output, media: media});
}
if (ioList.length > 0) {
- let latestInteraction = ioList[ioList.length - 1];
+ var latestInteraction = ioList[ioList.length - 1];
if (latestInteraction === 'undefined') {
latestInteraction = {};
}
- if (latestInteraction.output === null) {
+ //apply media/images
+ //var mediaURI = latestInteraction.media;
+ /*if (typeof mediaURI !== 'undefined' && mediaURI.indexOf('image') == 0) {
+ var mediaURL = baseURL + '/binary/default/mobile/images' + mediaURI.substring(mediaURI.lastIndexOf('/'));
+ var img = $('
');
+ img.attr('src', mediaURL);
+ img.attr('class', 'media_img');
+ $('#desktop').html(img);
+ } else {
+ $('#desktop').html('Nothing to show at the moment..
');
+ }*/
+
+ if (latestInteraction.output == null) {
latestInteraction.output = '';
}
- eddi.displayMessage(latestInteraction.output, 'left');
- displayQuickReplies(latestInteraction.quickReplies);
+ /*var mediaURIsString = latestInteraction.media;
+ if (mediaURIsString != null) {
+ var mediaURIs = mediaURIsString.split(',');
+ for (var n = 0; n < mediaURIs.length; n++) {
+ var mediaURI = mediaURIs[n];
+ if (mediaURI.indexOf('pdf') == 0) {
+ var fileName = mediaURI.substring(mediaURI.lastIndexOf('/') + 1);
+ var mediaURL = baseURL + '/binary/default/desktop/binary/' + fileName;
+ latestInteraction.output += '
' + fileName + ''
+ }
+ }
+ }*/
+
+ displayMessage(latestInteraction.output, 'left');
$('.message_input').focus();
}
};
- const pushArray = function (arr, arr2) {
- arr.push.apply(arr, arr2);
- };
-
- const deployBot = function (environment, botId, botVersion) {
+ var deployBot = function (environment, botId, botVersion) {
$.post("/administration/" + environment + "/deploy/" + botId + "?version=" + botVersion).done(function () {
checkBotDeploymentStatus();
});
};
- const checkBotDeploymentStatus = function () {
+ var checkBotDeploymentStatus = function () {
$.get("/administration/" + eddi.environment + "/deploymentstatus/" + eddi.botId + "?version=" + eddi.botVersion).done(function (data) {
if (data === 'IN_PROGRESS') {
setTimeout(checkBotDeploymentStatus, 1000);
@@ -190,16 +186,16 @@ $(function () {
});
};
- const createConversation = function (environment, botId) {
+ var createConversation = function (environment, botId) {
$.post("/bots/" + environment + "/" + botId).done(function (data, status, xhr) {
- const conversationUriArray = xhr.getResponseHeader('Location').split("/");
+ var conversationUriArray = xhr.getResponseHeader('Location').split("/");
eddi.conversationId = conversationUriArray[conversationUriArray.length - 1];
proceedConversation();
});
};
- const checkConversationStatus = function (environment, botId, conversationId) {
- $.get("/bots/" + environment + "/" + botId + "/" + conversationId).always(function (data, status) {
+ var checkConversationStatus = function (environment, botId, conversationId) {
+ $.get("/bots/" + environment + "/" + botId + "/" + conversationId).always(function (data, status, xhr) {
if (status === "error") {
alert("Checking conversation has yield into an error.. ");
} else if (status === "success") {
@@ -213,16 +209,16 @@ $(function () {
});
};
- const getQueryParts = function (href) {
- const query = $.url.parse(href);
- const path = query.path;
+ var getQueryParts = function (href) {
+ var query = $.url.parse(href);
+ var path = query.path;
- const parts = path.split("/");
+ var parts = path.split("/");
- let environment = null;
- let botId = null;
- let conversationId = null;
- let botVersion = null;
+ var environment = null;
+ var botId = null;
+ var conversationId = null;
+ var botVersion = null;
environment = typeof parts[2] !== 'undefined' ? decodeURIComponent(parts[2]) : environment;
botId = typeof parts[3] !== 'undefined' ? decodeURIComponent(parts[3]) : botId;
@@ -234,7 +230,7 @@ $(function () {
return {conversationId: conversationId, environment: environment, botId: botId, botVersion: botVersion};
};
- const proceedConversation = function () {
+ var proceedConversation = function () {
if (!eddi.conversationId) {
createConversation(eddi.environment, eddi.botId);
} else {
@@ -242,14 +238,13 @@ $(function () {
}
};
- const checkBotDeployment = function () {
+ var checkBotDeployment = function () {
//check if bot is deployed
$.get("/administration/" + eddi.environment + "/deploymentstatus/" + eddi.botId + "?version=" + eddi.botVersion)
.done(function (data) {
if (data === 'NOT_FOUND') {
- if (confirm('Bot is not deployed at the moment.. Deploy latest version NOW?')) {
- deployBot(eddi.environment, eddi.botId, eddi.botVersion);
- }
+ alert('Bot is not deployed at the moment.. Deploy NOW?');
+ deployBot(eddi.environment, eddi.botId, eddi.botVersion);
}
if (data === 'ERROR') {
@@ -267,7 +262,7 @@ $(function () {
};
$(document).ready(function () {
- const extractedParams = getQueryParts(window.location.href);
+ var extractedParams = getQueryParts(window.location.href);
//extract environment from URL
if (extractedParams.environment !== null) {
eddi.environment = extractedParams.environment;
@@ -294,4 +289,12 @@ $(function () {
});
}
});
+
+ /*displayMessage('Hello Philip! :)', 'left');
+ setTimeout(function () {
+ return displayMessage('Hi Sandy! How are you?', 'right');
+ }, 1000);
+ return setTimeout(function () {
+ return displayMessage('I\'m fine, thank you!', 'left');
+ }, 2000);*/
});
\ No newline at end of file
diff --git a/charts/eddi/.helmignore b/charts/eddi/.helmignore
new file mode 100644
index 000000000..f0c131944
--- /dev/null
+++ b/charts/eddi/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/charts/eddi/Chart.yaml b/charts/eddi/Chart.yaml
new file mode 100755
index 000000000..3ca2e43ba
--- /dev/null
+++ b/charts/eddi/Chart.yaml
@@ -0,0 +1,14 @@
+apiVersion: v1
+description: A Helm chart for the EDDI bot service
+name: eddi
+version: 1.1.2
+tier: api
+engine: gotpl
+keywords:
+- microservice
+- java
+- bot
+- nosql
+maintainers:
+- email: hello@edtechfoundry.com
+ name: Edtech Foundry
diff --git a/charts/eddi/requirements.yaml b/charts/eddi/requirements.yaml
new file mode 100644
index 000000000..be760fdcc
--- /dev/null
+++ b/charts/eddi/requirements.yaml
@@ -0,0 +1,4 @@
+dependencies:
+ - name: mongodb
+ version: 4.0.0
+ repository: https://differ-charts.storage.googleapis.com
diff --git a/charts/eddi/templates/deployment.yaml b/charts/eddi/templates/deployment.yaml
new file mode 100644
index 000000000..c6a6bba05
--- /dev/null
+++ b/charts/eddi/templates/deployment.yaml
@@ -0,0 +1,36 @@
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+ name: {{ .Values.appName }}
+ namespace: {{ .Values.namespace }}
+ labels:
+ app: {{ .Values.appName }}
+ chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+ tier: api
+spec:
+ replicas: {{ .Values.replicaCount }}
+ strategy:
+ type: RollingUpdate
+ template:
+ metadata:
+ labels:
+ app: {{ .Values.appName }}
+ chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
+ tier: api
+ spec:
+ containers:
+ - name: {{ .Chart.Name }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - containerPort: {{ .Values.containers.internalPort }}
+ env:
+{{ toYaml .Values.env | indent 12 }}
+ livenessProbe:
+ httpGet:
+ path: /health
+ port: {{ .Values.containers.internalPort }}
+ initialDelaySeconds: 50
+ timeoutSeconds: 5
+ resources:
+{{ toYaml .Values.resources | indent 12 }}
diff --git a/charts/eddi/values.production.yaml b/charts/eddi/values.production.yaml
new file mode 100644
index 000000000..3024cbb83
--- /dev/null
+++ b/charts/eddi/values.production.yaml
@@ -0,0 +1,22 @@
+namespace: default
+env:
+ - name: GET_HOSTS_FROM
+ value: dns
+ - name: GCLOUD_PROJECT
+ value: 'differ-140008'
+ - name: MONGODB_HOST
+ value: 'mongodb://eddi-storage-0.eddi-storage'
+resources:
+ limits:
+ cpu: 200m
+ # nodejs heap limit
+ memory: 1536Mi
+ requests:
+ cpu: 100m
+ memory: 128Mi
+mongodb:
+ diskSize: 20G
+ resources:
+ requests:
+ memory: 256Mi
+ cpu: 100m
diff --git a/charts/eddi/values.yaml b/charts/eddi/values.yaml
new file mode 100644
index 000000000..20bf5145f
--- /dev/null
+++ b/charts/eddi/values.yaml
@@ -0,0 +1,33 @@
+appName: eddi
+namespace: default
+replicaCount: 1
+image:
+ repository: eu.gcr.io/differ-140008/etf-service-bot-eddi
+ tag: latest
+ pullPolicy: IfNotPresent
+containers:
+ internalPort: 7070
+resources:
+ limits:
+ cpu: 100m
+ # nodejs heap limit
+ memory: 1536Mi
+ requests:
+ cpu: 20m
+ memory: 64Mi
+env:
+ - name: GET_HOSTS_FROM
+ value: dns
+ - name: GCLOUD_PROJECT
+ value: 'differ-140008'
+ - name: MONGODB_HOST
+ value: 'mongodb://eddi-storage-0.eddi-storage'
+mongodb:
+ appName: eddi-storage
+ namespace: default
+ mongodbVersion: 3.4
+ imagePullPolicy: IfNotPresent
+ resources:
+ requests:
+ memory: 128Mi
+ cpu: 20m
diff --git a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/bots/model/BotConfiguration.java b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/bots/model/BotConfiguration.java
index 1ab926fbb..51b4a10d1 100644
--- a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/bots/model/BotConfiguration.java
+++ b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/bots/model/BotConfiguration.java
@@ -6,9 +6,7 @@
import java.net.URI;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
/**
* @author ginccc
@@ -17,14 +15,13 @@
@Getter
@Setter
public class BotConfiguration {
- private boolean authenticationRequired = true;
- private List packages = new ArrayList<>();
- private List channels = new ArrayList<>();
+ private boolean authenticationRequired;
+ private List packages;
+ private List channels;
- @Getter
- @Setter
- public static class ChannelConnector {
- private URI type;
- private Map config = new HashMap<>();
+ public BotConfiguration() {
+ authenticationRequired = true;
+ this.packages = new ArrayList<>();
+ this.channels = new ArrayList<>();
}
}
diff --git a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/bots/model/ChannelConnector.java b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/bots/model/ChannelConnector.java
new file mode 100644
index 000000000..5959780c0
--- /dev/null
+++ b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/bots/model/ChannelConnector.java
@@ -0,0 +1,17 @@
+package ai.labs.resources.rest.bots.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.net.URI;
+import java.util.Map;
+
+/**
+ * @author ginccc
+ */
+@Getter
+@Setter
+public class ChannelConnector {
+ private URI type;
+ private Map config;
+}
diff --git a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfiguration.java b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfiguration.java
index 39cf1dcc3..6ff30cd3e 100644
--- a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfiguration.java
+++ b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfiguration.java
@@ -4,6 +4,7 @@
import lombok.Setter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
/**
@@ -15,21 +16,17 @@
public class OutputConfiguration {
private String key;
private List outputValues;
- private List quickReplies;
private int occurrence;
- public OutputConfiguration(String key, int occurrence, List outputValues, List quickReplies) {
+ public OutputConfiguration(String key, int occurrence, String... values) {
this.key = key;
this.occurrence = occurrence;
this.outputValues = new ArrayList<>();
- this.outputValues.addAll(outputValues);
- this.quickReplies = new ArrayList<>();
- this.quickReplies.addAll(quickReplies);
+ outputValues.addAll(Arrays.asList(values));
}
public OutputConfiguration() {
this.outputValues = new ArrayList<>();
- this.quickReplies = new ArrayList<>();
}
@Override
@@ -48,12 +45,4 @@ public int hashCode() {
result = 31 * result + occurrence;
return result;
}
-
- @Getter
- @Setter
- public static class QuickReply {
- private String value;
- private String expressions;
-
- }
}
diff --git a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfigurationSet.java b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfigurationSet.java
index 21312ad40..74baac678 100644
--- a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfigurationSet.java
+++ b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/output/model/OutputConfigurationSet.java
@@ -1,6 +1,5 @@
package ai.labs.resources.rest.output.model;
-import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@@ -13,7 +12,6 @@
@Getter
@Setter
-@EqualsAndHashCode
public class OutputConfigurationSet {
private List outputs;
diff --git a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/packages/model/PackageConfiguration.java b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/packages/model/PackageConfiguration.java
index 1e382fc36..656542da0 100644
--- a/configurationrepository-definition/src/main/java/ai/labs/resources/rest/packages/model/PackageConfiguration.java
+++ b/configurationrepository-definition/src/main/java/ai/labs/resources/rest/packages/model/PackageConfiguration.java
@@ -5,8 +5,6 @@
import lombok.Setter;
import java.net.URI;
-import java.util.HashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -18,13 +16,13 @@
@Setter
@NoArgsConstructor
public class PackageConfiguration {
- private List packageExtensions = new LinkedList<>();
+ private List packageExtensions;
@Getter
@Setter
public static class PackageExtension {
private URI type;
- private Map extensions = new HashMap<>();
- private Map config = new HashMap<>();
+ private Map extensions;
+ private Map config;
}
}
diff --git a/conversationcallback-impl/src/main/java/ai/labs/callback/impl/ConversationCallbackTask.java b/conversationcallback-impl/src/main/java/ai/labs/callback/impl/ConversationCallbackTask.java
index b5d85fddf..3ecb849e5 100644
--- a/conversationcallback-impl/src/main/java/ai/labs/callback/impl/ConversationCallbackTask.java
+++ b/conversationcallback-impl/src/main/java/ai/labs/callback/impl/ConversationCallbackTask.java
@@ -4,6 +4,7 @@
import ai.labs.callback.http.ConversationCallback;
import ai.labs.callback.model.ConversationDataRequest;
import ai.labs.callback.model.ConversationDataResponse;
+import ai.labs.lifecycle.AbstractLifecycleTask;
import ai.labs.lifecycle.ILifecycleTask;
import ai.labs.lifecycle.LifecycleException;
import ai.labs.lifecycle.PackageConfigurationException;
@@ -24,7 +25,7 @@
* Created by rpi on 08.02.2017.
*/
@Slf4j
-public class ConversationCallbackTask implements ILifecycleTask {
+public class ConversationCallbackTask extends AbstractLifecycleTask implements ILifecycleTask {
private static final String KEY_CALLBACK_URI = "callbackUri";
private static final String KEY_TIMEOUT_IN_MILLIS = "timeoutInMillis";
diff --git a/conversationlifecycle-definition/src/main/java/ai/labs/lifecycle/ILifecycleTask.java b/conversationlifecycle-definition/src/main/java/ai/labs/lifecycle/ILifecycleTask.java
index e5a6fdd47..8561a58f8 100644
--- a/conversationlifecycle-definition/src/main/java/ai/labs/lifecycle/ILifecycleTask.java
+++ b/conversationlifecycle-definition/src/main/java/ai/labs/lifecycle/ILifecycleTask.java
@@ -2,7 +2,6 @@
import ai.labs.memory.IConversationMemory;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -30,9 +29,7 @@ public interface ILifecycleTask {
*
* @return a List of Task IDs
*/
- default List getComponentDependencies() {
- return Collections.emptyList();
- }
+ List getComponentDependencies();
/**
* Returns a List representing all Task which have to be executed in lifecycle
@@ -41,21 +38,13 @@ default List getComponentDependencies() {
*
* @return a List of Task IDs
*/
- default List getOutputDependencies() {
- return Collections.emptyList();
- }
+ List getOutputDependencies();
- default void init() {
- //to be overridden if needed
- }
+ void init();
void executeTask(IConversationMemory memory) throws LifecycleException;
- default void configure(Map configuration) throws PackageConfigurationException {
- //to be overridden if needed
- }
+ void configure(Map configuration) throws PackageConfigurationException;
- default void setExtensions(Map extensions) throws UnrecognizedExtensionException, IllegalExtensionConfigurationException {
- //to be overridden if needed
- }
+ void setExtensions(Map extensions) throws UnrecognizedExtensionException, IllegalExtensionConfigurationException;
}
diff --git a/conversationlifecycle-impl/src/main/java/ai/labs/lifecycle/AbstractLifecycleTask.java b/conversationlifecycle-impl/src/main/java/ai/labs/lifecycle/AbstractLifecycleTask.java
new file mode 100644
index 000000000..1c612787f
--- /dev/null
+++ b/conversationlifecycle-impl/src/main/java/ai/labs/lifecycle/AbstractLifecycleTask.java
@@ -0,0 +1,25 @@
+package ai.labs.lifecycle;
+
+import java.util.Map;
+
+/**
+ * @author ginccc
+ */
+public abstract class AbstractLifecycleTask implements ILifecycleTask {
+
+
+ @Override
+ public void init() {
+ //TODO
+ }
+
+ @Override
+ public void configure(Map configuration) throws PackageConfigurationException {
+ //TODO
+ }
+
+ @Override
+ public void setExtensions(Map extensions) throws UnrecognizedExtensionException, IllegalExtensionConfigurationException {
+ //TODO
+ }
+}
diff --git a/conversationmemory-definition/src/main/java/ai/labs/memory/IConversationMemory.java b/conversationmemory-definition/src/main/java/ai/labs/memory/IConversationMemory.java
index 72c7ff4fc..024aa2367 100644
--- a/conversationmemory-definition/src/main/java/ai/labs/memory/IConversationMemory.java
+++ b/conversationmemory-definition/src/main/java/ai/labs/memory/IConversationMemory.java
@@ -43,9 +43,9 @@ public interface IConversationMemory extends Serializable {
interface IConversationStepStack {
- IData getLatestData(String key);
+ IData getLatestData(String key);
- List>> getAllData(String prefix);
+ List> getAllData(String prefix);
int size();
@@ -55,9 +55,9 @@ interface IConversationStepStack {
}
interface IConversationStep extends Serializable {
- IData getData(String key);
+ IData getData(String key);
- List> getAllData(String prefix);
+ List getAllData(String prefix);
Set getAllKeys();
@@ -73,7 +73,9 @@ interface IConversationStep extends Serializable {
boolean isEmpty();
- IData getLatestData(String prefix);
+ IData getLatestData();
+
+ IData getLatestData(String prefix);
}
interface IWritableConversationStep extends IConversationStep {
diff --git a/conversationmemory-definition/src/main/java/ai/labs/memory/IData.java b/conversationmemory-definition/src/main/java/ai/labs/memory/IData.java
index 16423a0ea..f7b18955b 100644
--- a/conversationmemory-definition/src/main/java/ai/labs/memory/IData.java
+++ b/conversationmemory-definition/src/main/java/ai/labs/memory/IData.java
@@ -7,12 +7,12 @@
/**
* @author ginccc
*/
-public interface IData extends Serializable {
+public interface IData extends Serializable {
String getKey();
- List getPossibleResults();
+ List getPossibleResults();
- T getResult();
+ Object getResult();
Date getTimestamp();
@@ -25,7 +25,7 @@ public interface IData extends Serializable {
void setPossibleResults(List possibleResults);
- void setResult(T result);
+ void setResult(Object result);
void setPublic(boolean isPublic);
}
diff --git a/conversationmemory-definition/src/main/java/ai/labs/memory/IDataFactory.java b/conversationmemory-definition/src/main/java/ai/labs/memory/IDataFactory.java
deleted file mode 100644
index 55ecc3cec..000000000
--- a/conversationmemory-definition/src/main/java/ai/labs/memory/IDataFactory.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package ai.labs.memory;
-
-import java.util.List;
-
-/**
- * @author ginccc
- */
-public interface IDataFactory {
- IData createData(String key, T value);
-
- IData createData(String key, T value, List possibleValues);
-}
diff --git a/conversationmemory-definition/src/main/java/ai/labs/memory/model/SimpleConversationMemorySnapshot.java b/conversationmemory-definition/src/main/java/ai/labs/memory/model/SimpleConversationMemorySnapshot.java
index 8c0b2e36e..218276396 100644
--- a/conversationmemory-definition/src/main/java/ai/labs/memory/model/SimpleConversationMemorySnapshot.java
+++ b/conversationmemory-definition/src/main/java/ai/labs/memory/model/SimpleConversationMemorySnapshot.java
@@ -96,9 +96,9 @@ public void setTimestamp(Date timestamp) {
public static class SimpleData {
private String key;
- private Object value;
+ private String value;
- public SimpleData(String key, Object value) {
+ public SimpleData(String key, String value) {
this.key = key;
this.value = value;
}
@@ -111,7 +111,7 @@ public void setKey(String key) {
this.key = key;
}
- public Object getValue() {
+ public String getValue() {
return value;
}
diff --git a/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemory.java b/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemory.java
index e2467107b..9b54c87a8 100644
--- a/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemory.java
+++ b/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemory.java
@@ -2,10 +2,7 @@
import ai.labs.memory.model.ConversationState;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Stack;
+import java.util.*;
/**
* @author ginccc
@@ -21,7 +18,7 @@ public class ConversationMemory implements IConversationMemory {
private IConversationMemory.IConversationContext context;
private ConversationState conversationState;
- ConversationMemory(String id, String botId, Integer botVersion) {
+ public ConversationMemory(String id, String botId, Integer botVersion) {
this(botId, botVersion);
this.id = id;
}
@@ -131,12 +128,20 @@ public Stack getRedoCache() {
public final class ConversationStepStack implements IConversationStepStack {
private List conversationSteps = new ArrayList<>();
- ConversationStepStack(List steps) {
+ public ConversationStepStack(IConversationStep step) {
+ conversationSteps.add(step);
+ }
+
+ public ConversationStepStack(IConversationStep... steps) {
+ conversationSteps.addAll(Arrays.asList(steps));
+ }
+
+ public ConversationStepStack(List steps) {
conversationSteps.addAll(steps);
}
@Override
- public IData getLatestData(String key) {
+ public IData getLatestData(String key) {
for (int i = conversationSteps.size() - 1; i >= 0; --i) {
IConversationStep step = conversationSteps.get(i);
if (step.getData(key) != null) {
@@ -147,12 +152,12 @@ public IData getLatestData(String key) {
}
@Override
- public List>> getAllData(String prefix) {
- List>> allData = new LinkedList<>();
+ public List> getAllData(String prefix) {
+ List> allData = new LinkedList<>();
for (int i = conversationSteps.size() - 1; i >= 0; i--) {
IConversationStep step = conversationSteps.get(i);
- List> dataList = step.getAllData(prefix);
+ List dataList = step.getAllData(prefix);
if (!dataList.isEmpty()) {
allData.add(dataList);
}
@@ -188,15 +193,15 @@ public void add(IConversationStep step) {
public static class ConversationContext implements IConversationContext {
private String context;
- ConversationContext() {
+ public ConversationContext() {
this.context = "";
}
- ConversationContext(String context) {
+ public ConversationContext(String context) {
this.context = context;
}
- ConversationContext(IConversationContext context) {
+ public ConversationContext(IConversationContext context) {
this.context = context.getContext();
}
diff --git a/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemoryUtilities.java b/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemoryUtilities.java
index f583abbfd..6ffc6a543 100644
--- a/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemoryUtilities.java
+++ b/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationMemoryUtilities.java
@@ -3,6 +3,7 @@
import ai.labs.memory.model.ConversationMemorySnapshot;
import ai.labs.memory.model.SimpleConversationMemorySnapshot;
import ai.labs.persistence.IResourceStore;
+import ai.labs.utilities.CharacterUtilities;
import java.util.LinkedList;
import java.util.List;
@@ -11,7 +12,7 @@
* @author ginccc
*/
public class ConversationMemoryUtilities {
- public static ConversationMemorySnapshot convertConversationMemory(IConversationMemory conversationMemory) {
+ public static ConversationMemorySnapshot convertConversationMemory(IConversationMemory conversationMemory) throws IResourceStore.ResourceStoreException {
ConversationMemorySnapshot snapshot = new ConversationMemorySnapshot();
if (conversationMemory.getId() != null) {
@@ -54,7 +55,7 @@ private static ConversationMemorySnapshot.ConversationStepSnapshot iterateConver
}
private static List iterateRedoCache(List redoSteps) {
- List conversationSteps = new LinkedList<>();
+ List conversationSteps = new LinkedList();
for (ConversationMemorySnapshot.ConversationStepSnapshot redoStep : redoSteps) {
IConversationMemory.IWritableConversationStep conversationStep = new ConversationStep(new ConversationMemory.ConversationContext());
conversationSteps.add(conversationStep);
@@ -115,8 +116,8 @@ public static SimpleConversationMemorySnapshot convertSimpleConversationMemory(C
for (ConversationMemorySnapshot.ResultSnapshot resultSnapshot : packageRunSnapshot.getLifecycleTasks()) {
if (includeAll || resultSnapshot.isPublic()) {
Object result = resultSnapshot.getResult();
- simpleConversationStep.getData().add(
- new SimpleConversationMemorySnapshot.SimpleData(resultSnapshot.getKey(), result));
+ String value = result instanceof List ? CharacterUtilities.arrayToString((List) result, ",") : result.toString();
+ simpleConversationStep.getData().add(new SimpleConversationMemorySnapshot.SimpleData(resultSnapshot.getKey(), value));
} else {
continue;
}
diff --git a/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationStep.java b/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationStep.java
index dd2b6eb87..f13999a06 100644
--- a/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationStep.java
+++ b/conversationmemory-impl/src/main/java/ai/labs/memory/ConversationStep.java
@@ -6,34 +6,34 @@
* @author ginccc
*/
public class ConversationStep implements IConversationMemory.IWritableConversationStep {
- private Map> store;
+ protected Map> store;
private IConversationMemory.IConversationContext conversationContext;
- int conversationStepNumber;
+ protected int conversationStepNumber;
- ConversationStep(IConversationMemory.IConversationContext conversationContext) {
+ public ConversationStep(IConversationMemory.IConversationContext conversationContext) {
this.conversationContext = conversationContext;
- store = new LinkedHashMap<>();
+ store = new LinkedHashMap>();
}
@Override
- public IData getData(String key) {
+ public IData getData(String key) {
return getCurrentContext().get(key);
}
private Map getCurrentContext() {
if (!store.containsKey(conversationContext)) {
- store.put(new ConversationMemory.ConversationContext(conversationContext), new LinkedHashMap<>());
+ store.put(new ConversationMemory.ConversationContext(conversationContext), new LinkedHashMap());
}
return store.get(conversationContext);
}
@Override
- public List> getAllData(String prefix) {
- List> dataList = new ArrayList<>();
+ public List getAllData(String prefix) {
+ List dataList = new ArrayList();
for (String key : getCurrentContext().keySet()) {
- IData data = getData(key);
+ IData data = getData(key);
if (data != null) {
if (key.startsWith(prefix))
dataList.add(data);
@@ -45,7 +45,8 @@ public List> getAllData(String prefix) {
@Override
public void storeData(IData data) {
- getCurrentContext().put(data.getKey(), data);
+ Data value = new Data(data);
+ getCurrentContext().put(data.getKey(), value);
}
@Override
@@ -56,7 +57,7 @@ public Set getAllKeys() {
@Override
public List getAllElements(IConversationMemory.IConversationContext context) {
Map contextMap = store.get(context);
- return contextMap != null ? new ArrayList<>(contextMap.values()) : new ArrayList<>();
+ return contextMap != null ? new ArrayList(contextMap.values()) : new ArrayList();
}
@Override
@@ -75,13 +76,21 @@ public Set getAllConversationContexts(
}
@Override
- public IData getLatestData(String prefix) {
+ public IData getLatestData() {
+ List elements = getAllElements(conversationContext);
+ if (elements.isEmpty())
+ return null;
+
+ return elements.get(elements.size() - 1);
+ }
+
+ @Override
+ public IData getLatestData(String prefix) {
List elements = getAllElements(conversationContext);
Collections.reverse(elements);
for (IData element : elements) {
- if (element.getKey().startsWith(prefix)) {
+ if (element.getKey().startsWith(prefix))
return element;
- }
}
return null;
@@ -114,9 +123,11 @@ public int hashCode() {
@Override
public String toString() {
- return "ConversationStep" +
- "{input=" + getLatestData("input") +
- ", output=" + getLatestData("output") +
- '}';
+ final StringBuilder sb = new StringBuilder();
+ sb.append("ConversationStep");
+ sb.append("{input=").append(getLatestData("input"));
+ sb.append(", output=").append(getLatestData("output"));
+ sb.append('}');
+ return sb.toString();
}
}
diff --git a/conversationmemory-impl/src/main/java/ai/labs/memory/Data.java b/conversationmemory-impl/src/main/java/ai/labs/memory/Data.java
index 4648a409a..7044de59c 100644
--- a/conversationmemory-impl/src/main/java/ai/labs/memory/Data.java
+++ b/conversationmemory-impl/src/main/java/ai/labs/memory/Data.java
@@ -1,9 +1,6 @@
package ai.labs.memory;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.util.Collections;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Random;
@@ -11,33 +8,31 @@
/**
* @author ginccc
*/
-@Getter
-@Setter
-public class Data implements IData {
+public class Data implements IData {
private final String key;
private List possibleResults;
- private T result;
+ private Object result;
private final Date timestamp;
private boolean isPublic;
- public Data(IData data) {
+ public Data(IData data) {
this(data.getKey(), data.getResult(), data.getPossibleResults(), data.getTimestamp(), data.isPublic());
this.result = data.getResult();
}
- public Data(String key, T result) {
- this(key, result, Collections.singletonList(result), new Date(System.currentTimeMillis()));
+ public Data(String key, Object result) {
+ this(key, result, Arrays.asList(result), new Date(System.currentTimeMillis()));
}
- public Data(String key, T result, List possibleResults) {
+ public Data(String key, Object result, List possibleResults) {
this(key, result, possibleResults, new Date(System.currentTimeMillis()));
}
- public Data(String key, T result, List possibleResults, Date timestamp) {
+ public Data(String key, Object result, List possibleResults, Date timestamp) {
this(key, result, possibleResults, timestamp, false);
}
- public Data(String key, T result, List possibleResults, Date timestamp, boolean isPublic) {
+ public Data(String key, Object result, List possibleResults, Date timestamp, boolean isPublic) {
this.key = key;
this.result = result == null ? chooseRandomResult(possibleResults) : result;
this.possibleResults = possibleResults;
@@ -45,7 +40,47 @@ public Data(String key, T result, List possibleResults, Date timestamp, boole
this.isPublic = isPublic;
}
- private T chooseRandomResult(List results) {
+ @Override
+ public String getKey() {
+ return key;
+ }
+
+ @Override
+ public void setPossibleResults(List possibleResults) {
+ this.possibleResults = possibleResults;
+ }
+
+ @Override
+ public List getPossibleResults() {
+ return possibleResults;
+ }
+
+ @Override
+ public void setResult(Object result) {
+ this.result = result;
+ }
+
+ @Override
+ public Object getResult() {
+ return result;
+ }
+
+ @Override
+ public Date getTimestamp() {
+ return timestamp;
+ }
+
+ @Override
+ public boolean isPublic() {
+ return isPublic;
+ }
+
+ @Override
+ public void setPublic(boolean isPublic) {
+ this.isPublic = isPublic;
+ }
+
+ private Object chooseRandomResult(List results) {
if (!results.isEmpty()) {
Random random = new Random();
int randNumber = random.nextInt(results.size());
diff --git a/conversationmemory-impl/src/main/java/ai/labs/memory/DataFactory.java b/conversationmemory-impl/src/main/java/ai/labs/memory/DataFactory.java
deleted file mode 100644
index a9471976a..000000000
--- a/conversationmemory-impl/src/main/java/ai/labs/memory/DataFactory.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package ai.labs.memory;
-
-import java.util.List;
-
-/**
- * @author ginccc
- */
-public class DataFactory implements IDataFactory {
- @Override
- public IData createData(String key, T value) {
- return new Data<>(key, value);
- }
-
- @Override
- public IData createData(String key, T value, List possibleValues) {
- return new Data<>(key, value, possibleValues);
- }
-}
diff --git a/conversationmemory-impl/src/main/java/ai/labs/memory/bootstrap/ConversationMemoryModule.java b/conversationmemory-impl/src/main/java/ai/labs/memory/bootstrap/ConversationMemoryModule.java
index 25bd214e4..98a340c0d 100644
--- a/conversationmemory-impl/src/main/java/ai/labs/memory/bootstrap/ConversationMemoryModule.java
+++ b/conversationmemory-impl/src/main/java/ai/labs/memory/bootstrap/ConversationMemoryModule.java
@@ -1,6 +1,8 @@
package ai.labs.memory.bootstrap;
-import ai.labs.memory.*;
+import ai.labs.memory.ConversationDescriptorStore;
+import ai.labs.memory.ConversationMemoryStore;
+import ai.labs.memory.IConversationMemoryStore;
import ai.labs.memory.descriptor.IConversationDescriptorStore;
import ai.labs.runtime.bootstrap.AbstractBaseModule;
import com.google.inject.Scopes;
@@ -14,6 +16,5 @@ public class ConversationMemoryModule extends AbstractBaseModule {
protected void configure() {
bind(IConversationDescriptorStore.class).to(ConversationDescriptorStore.class).in(Scopes.SINGLETON);
bind(IConversationMemoryStore.class).to(ConversationMemoryStore.class).in(Scopes.SINGLETON);
- bind(IDataFactory.class).to(DataFactory.class).in(Scopes.SINGLETON);
}
}
diff --git a/conversationmemory-impl/src/test/java/ai/labs/memory/ConversationStepTest.java b/conversationmemory-impl/src/test/java/ai/labs/memory/ConversationStepTest.java
index b3060da99..87cf077be 100644
--- a/conversationmemory-impl/src/test/java/ai/labs/memory/ConversationStepTest.java
+++ b/conversationmemory-impl/src/test/java/ai/labs/memory/ConversationStepTest.java
@@ -28,7 +28,7 @@ public void tearDown() throws Exception {
public void testPlain() throws Exception {
//assert
Assert.assertNull(conversationStep.getData("whatever"));
- final List> allData = conversationStep.getAllData("void");
+ final List allData = conversationStep.getAllData("asdf");
Assert.assertNotNull(allData);
Assert.assertTrue(allData.size() == 0);
Assert.assertNotNull(conversationStep.getAllElements(conversationStep.getCurrentConversationContext()));
@@ -42,24 +42,24 @@ public void testPlain() throws Exception {
@Test
public void testGetData() throws Exception {
//setup
- final Data data = new Data("testKey", new LinkedList());
+ final Data data = new Data("testkey", new LinkedList());
conversationStep.storeData(data);
//assert
- Assert.assertNotNull(conversationStep.getData("testKey"));
- Assert.assertEquals(data, conversationStep.getData("testKey"));
+ Assert.assertNotNull(conversationStep.getData("testkey"));
+ Assert.assertEquals(data, conversationStep.getData("testkey"));
}
@Test
public void testGetAllData() throws Exception {
//setup
- final Data data1 = new Data("testKey1", new LinkedList());
- final Data data2 = new Data("testKey2", new LinkedList());
+ final Data data1 = new Data("testkey1", new LinkedList());
+ final Data data2 = new Data("testkey2", new LinkedList());
conversationStep.storeData(data1);
conversationStep.storeData(data2);
//test
- final List> allData = conversationStep.getAllData("testKey");
+ final List allData = conversationStep.getAllData("testkey");
//assert
Assert.assertNotNull(allData);
@@ -71,8 +71,8 @@ public void testGetAllData() throws Exception {
@Test
public void testGetAllKeys() throws Exception {
//setup
- final Data data1 = new Data("testKey1", new LinkedList());
- final Data data2 = new Data("testKey2", new LinkedList());
+ final Data data1 = new Data("testkey1", new LinkedList());
+ final Data data2 = new Data("testkey2", new LinkedList());
conversationStep.storeData(data1);
conversationStep.storeData(data2);
@@ -81,16 +81,16 @@ public void testGetAllKeys() throws Exception {
//assert
Assert.assertNotNull(allKeys);
- Assert.assertEquals("testKey1", allKeys.toArray()[0]);
- Assert.assertEquals("testKey2", allKeys.toArray()[1]);
+ Assert.assertEquals("testkey1", allKeys.toArray()[0]);
+ Assert.assertEquals("testkey2", allKeys.toArray()[1]);
}
@Test
public void testGetAllElements() throws Exception {
//setup
- final Data data1 = new Data<>("testKey1", "testData1");
- final Data data2 = new Data<>("testKey2", "testData2");
+ final Data data1 = new Data("testkey1", "testData1");
+ final Data data2 = new Data("testkey2", "testData2");
conversationStep.storeData(data1);
conversationStep.storeData(data2);
@@ -106,7 +106,7 @@ public void testGetAllElements() throws Exception {
@Test
public void testSize() throws Exception {
//setup
- final Data data1 = new Data("testKey1", new LinkedList());
+ final Data data1 = new Data("testkey1", new LinkedList());
conversationStep.storeData(data1);
//assert
@@ -116,7 +116,7 @@ public void testSize() throws Exception {
@Test
public void testIsEmpty() throws Exception {
//setup
- final Data data1 = new Data("testKey1", new LinkedList());
+ final Data data1 = new Data("testkey1", new LinkedList());
conversationStep.storeData(data1);
//assert
@@ -126,7 +126,7 @@ public void testIsEmpty() throws Exception {
@Test
public void testEquals() throws Exception {
//setup
- final Data data = new Data("testKey", new LinkedList());
+ final Data data = new Data("testkey", new LinkedList());
this.conversationStep.storeData(data);
ConversationStep conversationStep = new ConversationStep(new ConversationMemory.ConversationContext());
conversationStep.storeData(data);
diff --git a/coreserver/src/main/java/ai/labs/core/CoreRuntime.java b/coreserver/src/main/java/ai/labs/core/CoreRuntime.java
index 997e65c56..227371c6a 100644
--- a/coreserver/src/main/java/ai/labs/core/CoreRuntime.java
+++ b/coreserver/src/main/java/ai/labs/core/CoreRuntime.java
@@ -63,6 +63,10 @@ public static void initializeBehaviourRuleRegistry() {
attribute("expressions", "List", "").build();
behaviorRuleExtensionRegistry.register(inputMatcherDescriptor.getId(), inputMatcherDescriptor);
+ IExtensionDescriptor propertyMatcherDescriptor = ExtensionDescriptorBuilder.create(PropertyMatcher.ID, "", "ai.labs.core.behavior.extensions.PropertyMatcher").
+ attribute("expressions", "List", "").build();
+ behaviorRuleExtensionRegistry.register(propertyMatcherDescriptor.getId(), propertyMatcherDescriptor);
+
IExtensionDescriptor connectorDescriptor = ExtensionDescriptorBuilder.create(Connector.ID, "", "ai.labs.core.behavior.extensions.Connector").
attribute("operator", "String", "").build();
behaviorRuleExtensionRegistry.register(connectorDescriptor.getId(), connectorDescriptor);
@@ -80,6 +84,12 @@ public static void initializeBehaviourRuleRegistry() {
attribute("behaviorRuleName", "String", "").build();
behaviorRuleExtensionRegistry.register(occurrenceDescriptor.getId(), occurrenceDescriptor);
+ IExtensionDescriptor outputReferenceDescriptor = ExtensionDescriptorBuilder.create(OutputReference.ID, "", "ai.labs.core.behavior.extensions.OutputReference").
+ attribute("inputValue", "String", "").
+ attribute("sessionValue", "String", "").
+ attribute("filter", "String", "").build();
+ behaviorRuleExtensionRegistry.register(outputReferenceDescriptor.getId(), outputReferenceDescriptor);
+
IExtensionDescriptor resultSizeDescriptor = ExtensionDescriptorBuilder.create(ResultSize.ID, "", "ai.labs.core.behavior.extensions.ResultSize").
attribute("max", "Integer", "").
attribute("min", "Integer", "").
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorGroup.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorGroup.java
index 8c37a5e67..9166c9ff6 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorGroup.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorGroup.java
@@ -1,21 +1,32 @@
package ai.labs.core.behavior;
-import lombok.Getter;
-import lombok.Setter;
-
import java.util.LinkedList;
import java.util.List;
/**
* @author ginccc
*/
-@Getter
-@Setter
public class BehaviorGroup {
private String name;
private List behaviorRules;
- BehaviorGroup() {
- behaviorRules = new LinkedList<>();
+ public BehaviorGroup() {
+ behaviorRules = new LinkedList();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getBehaviorRules() {
+ return behaviorRules;
+ }
+
+ public void setBehaviorRules(List behaviorRules) {
+ this.behaviorRules = behaviorRules;
}
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRule.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRule.java
index 517b4b62b..9119c6c10 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRule.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRule.java
@@ -2,9 +2,6 @@
import ai.labs.core.behavior.extensions.IExtension;
import ai.labs.memory.IConversationMemory;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.util.LinkedList;
@@ -14,23 +11,56 @@
* @author ginccc
*/
@Slf4j
-@NoArgsConstructor
-@Getter
-@Setter
public class BehaviorRule implements Cloneable {
private String name;
- private List actions = new LinkedList<>();
- private List extensions = new LinkedList<>();
+ private List actions;
+ private List extensions;
+
+ public BehaviorRule() {
+ actions = new LinkedList<>();
+ extensions = new LinkedList<>();
+ }
public BehaviorRule(String name) {
this.name = name;
+ actions = new LinkedList<>();
+ extensions = new LinkedList<>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List getActions() {
+ return actions;
+ }
+
+ public void setActions(List actions) {
+ this.actions = actions;
+ }
+
+ public void setExtensions(List extensions) {
+ this.extensions = extensions;
+ }
+
+ public List getExtensions() {
+ return extensions;
}
- public IExtension.ExecutionState execute(IConversationMemory memory, List trace)
- throws InfiniteLoopException {
+ public IExtension.ExecutionState execute(IConversationMemory memory, List trace) {
if (trace.contains(this)) {
- // this is an infinite loop, thus throw error
- throw throwInfiniteLoopError(trace);
+ List endlessLoop = trace.subList(trace.indexOf(this), trace.size());
+ endlessLoop.add(this);
+
+ log.error("reached endless loop:");
+ for (BehaviorRule status : trace)
+ log.error(" -> " + status.getName());
+
+ return IExtension.ExecutionState.ERROR;
} else {
trace.add(this);
@@ -46,7 +76,7 @@ public IExtension.ExecutionState execute(IConversationMemory memory, List tmp = new LinkedList<>(trace);
+ List tmp = new LinkedList(trace);
trace.clear();
trace.addAll(tmp.subList(0, tmp.indexOf(this)));
@@ -57,18 +87,6 @@ public IExtension.ExecutionState execute(IConversationMemory memory, List trace)
- throws InfiniteLoopException {
- StringBuilder errorMessage = new StringBuilder();
-
- errorMessage.append("reached infinite loop:\n");
- for (BehaviorRule status : trace) {
- errorMessage.append(" -> ").append(status.getName()).append("\n");
- }
-
- return new InfiniteLoopException(errorMessage.toString());
- }
-
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -83,7 +101,7 @@ public boolean equals(Object o) {
public BehaviorRule clone() throws CloneNotSupportedException {
BehaviorRule clone = new BehaviorRule(name);
- List executablesClone = new LinkedList<>();
+ List executablesClone = new LinkedList();
for (IExtension extension : extensions) {
IExtension exClone = extension.clone();
executablesClone.add(exClone);
@@ -97,10 +115,4 @@ public BehaviorRule clone() throws CloneNotSupportedException {
public String toString() {
return name;
}
-
- public class InfiniteLoopException extends Exception {
- InfiniteLoopException(String message) {
- super(message);
- }
- }
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRuleSetParser.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRuleSetParser.java
new file mode 100644
index 000000000..fd216beb9
--- /dev/null
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRuleSetParser.java
@@ -0,0 +1,10 @@
+package ai.labs.core.behavior;
+
+/**
+ * @author ginccc
+ */
+public class BehaviorRuleSetParser {
+ public BehaviorSet parseJSONBehaviorRuleSet(String json) {
+ return new BehaviorSet();
+ }
+}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluationTask.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluationTask.java
index 4025ecb4c..aef27a467 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluationTask.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluationTask.java
@@ -1,5 +1,6 @@
package ai.labs.core.behavior;
+import ai.labs.lifecycle.AbstractLifecycleTask;
import ai.labs.lifecycle.ILifecycleTask;
import ai.labs.lifecycle.LifecycleException;
import ai.labs.lifecycle.PackageConfigurationException;
@@ -16,6 +17,7 @@
import javax.inject.Singleton;
import java.io.IOException;
import java.net.URI;
+import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -26,20 +28,21 @@
*/
@Singleton
@Slf4j
-public class BehaviorRulesEvaluationTask implements ILifecycleTask {
+public class BehaviorRulesEvaluationTask extends AbstractLifecycleTask implements ILifecycleTask {
private BehaviorRulesEvaluator evaluator;
private static final String BEHAVIOR_CONFIG = "uri";
private final IResourceClientLibrary resourceClientLibrary;
private final IJsonSerialization jsonSerialization;
- private final IBehaviorDeserialization behaviorSerialization;
+ private final IBehaviorSerialization behaviorSerialization;
@Inject
public BehaviorRulesEvaluationTask(IResourceClientLibrary resourceClientLibrary,
IJsonSerialization jsonSerialization,
- IBehaviorDeserialization behaviorSerialization) {
+ IBehaviorSerialization behaviorSerialization) {
this.resourceClientLibrary = resourceClientLibrary;
this.jsonSerialization = jsonSerialization;
this.behaviorSerialization = behaviorSerialization;
+ this.evaluator = new BehaviorRulesEvaluator();
}
@Override
@@ -52,6 +55,16 @@ public Object getComponent() {
return evaluator;
}
+ @Override
+ public List getComponentDependencies() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List getOutputDependencies() {
+ return Collections.emptyList();
+ }
+
@Override
public void executeTask(IConversationMemory memory) throws LifecycleException {
BehaviorSetResult results;
@@ -77,14 +90,14 @@ private void addActionsToConversationMemory(IConversationMemory memory, List("actions", allActions);
+ Data actions = new Data("actions", allActions);
actions.setPublic(true);
memory.getCurrentStep().storeData(actions);
}
private void storeResultIfNotEmpty(IConversationMemory memory, String key, List result) {
if (!result.isEmpty()) {
- memory.getCurrentStep().storeData(new Data<>(key, convert(result)));
+ memory.getCurrentStep().storeData(new Data(key, convert(result)));
}
}
@@ -103,7 +116,7 @@ public void configure(Map configuration) throws PackageConfigura
String behaviorConfigJson = jsonSerialization.serialize(behaviorConfiguration);
BehaviorSet behaviorSet = behaviorSerialization.deserialize(behaviorConfigJson);
- evaluator = new BehaviorRulesEvaluator(behaviorSet);
+ evaluator.setBehaviorSet(behaviorSet);
} catch (IOException | DeserializationException e) {
String message = "Error while configuring BehaviorRuleLifecycleTask!";
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluator.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluator.java
index 38da61798..54abd59a5 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluator.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorRulesEvaluator.java
@@ -3,7 +3,6 @@
import ai.labs.core.behavior.extensions.IExtension;
import ai.labs.memory.IConversationMemory;
import ai.labs.utilities.RuntimeUtilities;
-import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.LinkedList;
@@ -12,11 +11,17 @@
* @author ginccc
*/
@Slf4j
-@AllArgsConstructor
-class BehaviorRulesEvaluator {
+public class BehaviorRulesEvaluator {
private BehaviorSet behaviorSet;
- BehaviorSetResult evaluate(IConversationMemory memory) throws BehaviorRuleExecutionException {
+ public BehaviorRulesEvaluator() {
+ }
+
+ public void setBehaviorSet(BehaviorSet behaviorSet) {
+ this.behaviorSet = behaviorSet;
+ }
+
+ public BehaviorSetResult evaluate(IConversationMemory memory) throws BehaviorRuleExecutionException {
RuntimeUtilities.checkNotNull(behaviorSet, "behaviorSet");
BehaviorSetResult resultSet = new BehaviorSetResult();
@@ -32,11 +37,7 @@ BehaviorSetResult evaluate(IConversationMemory memory) throws BehaviorRuleExecut
if (behaviorRule.getExtensions().isEmpty()) {
state = IExtension.ExecutionState.SUCCESS;
} else {
- try {
- state = behaviorRule.execute(memory, new LinkedList<>());
- } catch (BehaviorRule.InfiniteLoopException e) {
- throw new BehaviorRuleExecutionException(e.getLocalizedMessage(), e);
- }
+ state = behaviorRule.execute(memory, new LinkedList<>());
}
if (state == IExtension.ExecutionState.SUCCESS) {
@@ -71,9 +72,5 @@ class BehaviorRuleExecutionException extends Exception {
private BehaviorRuleExecutionException(String message) {
super(message);
}
-
- BehaviorRuleExecutionException(String message, Exception e) {
- super(message, e);
- }
}
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorDeserialization.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSerialization.java
similarity index 62%
rename from coreserver/src/main/java/ai/labs/core/behavior/BehaviorDeserialization.java
rename to coreserver/src/main/java/ai/labs/core/behavior/BehaviorSerialization.java
index 8b3a9dc3d..b8fdf4797 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorDeserialization.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSerialization.java
@@ -12,17 +12,19 @@
import javax.inject.Inject;
import java.io.IOException;
+import java.io.StringWriter;
import java.util.LinkedList;
import java.util.List;
/**
* @author ginccc
*/
-public class BehaviorDeserialization implements IBehaviorDeserialization {
+public class BehaviorSerialization implements IBehaviorSerialization {
+
private final ObjectMapper objectMapper;
@Inject
- public BehaviorDeserialization(ObjectMapper objectMapper) {
+ public BehaviorSerialization(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@@ -52,7 +54,7 @@ public BehaviorSet deserialize(String json) throws DeserializationException {
}
private static List convert(List children, BehaviorSet behaviorSet) throws CloneNotSupportedException, IExtensionRegistry.ExtensionRegistryException {
- List ret = new LinkedList<>();
+ List ret = new LinkedList();
for (BehaviorRuleElementConfiguration child : children) {
IExtension extension = BehaviorRuleExtensionRegistry.getInstance().getExtension(child.getType());
extension.setValues(child.getValues());
@@ -69,4 +71,48 @@ private static List convert(List c
return ret;
}
+
+ @Override
+ public String serialize(BehaviorSet set) throws IOException {
+ BehaviorConfiguration result = new BehaviorConfiguration();
+
+ for (BehaviorGroup group : set.getBehaviorGroups()) {
+ BehaviorGroupConfiguration behaviorGroupConfiguration = new BehaviorGroupConfiguration();
+ behaviorGroupConfiguration.setName(group.getName());
+ result.getBehaviorGroups().add(behaviorGroupConfiguration);
+ for (BehaviorRule behaviorRule : group.getBehaviorRules()) {
+ behaviorGroupConfiguration.getBehaviorRules().add(convert(behaviorRule));
+ }
+ }
+
+ StringWriter writer = new StringWriter();
+ objectMapper.writeValue(writer, result);
+
+ return writer.toString();
+ }
+
+ private static BehaviorRuleConfiguration convert(BehaviorRule behaviorRule) {
+ BehaviorRuleConfiguration result = new BehaviorRuleConfiguration();
+
+ result.setName(behaviorRule.getName());
+ result.setActions(behaviorRule.getActions());
+ for (IExtension extension : behaviorRule.getExtensions()) {
+ result.getChildren().add(convert(extension));
+ }
+
+ return result;
+ }
+
+ private static BehaviorRuleElementConfiguration convert(IExtension extension) {
+ BehaviorRuleElementConfiguration behaviorRuleElementJson = new BehaviorRuleElementConfiguration();
+
+ behaviorRuleElementJson.setType(extension.getId());
+ behaviorRuleElementJson.getValues().putAll(extension.getValues());
+
+ for (IExtension e : extension.getChildren()) {
+ behaviorRuleElementJson.getChildren().add(convert(e));
+ }
+
+ return behaviorRuleElementJson;
+ }
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSet.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSet.java
index a33fc0b4d..78d390ff3 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSet.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSet.java
@@ -1,23 +1,19 @@
package ai.labs.core.behavior;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
import java.util.LinkedList;
import java.util.List;
/**
* @author ginccc
*/
-@NoArgsConstructor
-@Getter
-@Setter
public class BehaviorSet {
- private List behaviorGroups = new LinkedList<>();
+ private List behaviorGroups = new LinkedList();
+
+ public BehaviorSet() {
+ }
public List getBehaviorRule(String behaviorRule) {
- List ret = new LinkedList<>();
+ List ret = new LinkedList();
for (BehaviorGroup behaviorGroup : behaviorGroups) {
for (BehaviorRule status : behaviorGroup.getBehaviorRules()) {
if (status.getName().equals(behaviorRule)) {
@@ -28,4 +24,12 @@ public List getBehaviorRule(String behaviorRule) {
return ret;
}
+
+ public List getBehaviorGroups() {
+ return behaviorGroups;
+ }
+
+ public void setBehaviorGroups(List behaviorGroups) {
+ this.behaviorGroups = behaviorGroups;
+ }
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSetResult.java b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSetResult.java
index 29a1cd96d..ebfa526eb 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSetResult.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/BehaviorSetResult.java
@@ -1,22 +1,52 @@
package ai.labs.core.behavior;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.ToString;
-
import java.util.LinkedList;
import java.util.List;
/**
* @author ginccc
*/
-@NoArgsConstructor
-@Getter
-@Setter
-@ToString
public class BehaviorSetResult {
- private List successRules = new LinkedList<>();
- private List droppedSuccessRules = new LinkedList<>();
- private List failRules = new LinkedList<>();
+ private List successRules;
+ private List droppedSuccessRules;
+ private List failRules;
+
+ public BehaviorSetResult() {
+ successRules = new LinkedList();
+ droppedSuccessRules = new LinkedList();
+ failRules = new LinkedList();
+ }
+
+ public List getSuccessRules() {
+ return successRules;
+ }
+
+ public void setSuccessRules(List successRules) {
+ this.successRules = successRules;
+ }
+
+ public List getDroppedSuccessRules() {
+ return droppedSuccessRules;
+ }
+
+ public void setDroppedSuccessRules(List droppedSuccessRules) {
+ this.droppedSuccessRules = droppedSuccessRules;
+ }
+
+ public List getFailRules() {
+ return failRules;
+ }
+
+ public void setFailRules(List failRules) {
+ this.failRules = failRules;
+ }
+
+ @Override
+ public String toString() {
+ return "BehaviorSetResult{" +
+ "successRules=" + successRules +
+ ", droppedSuccessRules=" + droppedSuccessRules +
+ ", failRules=" + failRules +
+ '}';
+ }
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/IBehaviorDeserialization.java b/coreserver/src/main/java/ai/labs/core/behavior/IBehaviorSerialization.java
similarity index 59%
rename from coreserver/src/main/java/ai/labs/core/behavior/IBehaviorDeserialization.java
rename to coreserver/src/main/java/ai/labs/core/behavior/IBehaviorSerialization.java
index c06b9570e..f0699ea1b 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/IBehaviorDeserialization.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/IBehaviorSerialization.java
@@ -2,9 +2,13 @@
import ai.labs.serialization.DeserializationException;
+import java.io.IOException;
+
/**
* @author ginccc
*/
-public interface IBehaviorDeserialization {
+public interface IBehaviorSerialization {
BehaviorSet deserialize(String json) throws DeserializationException;
+
+ String serialize(BehaviorSet set) throws IOException;
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Connector.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Connector.java
index 4ee82b382..41452f981 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Connector.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Connector.java
@@ -1,10 +1,8 @@
package ai.labs.core.behavior.extensions;
import ai.labs.core.behavior.BehaviorRule;
+import ai.labs.core.behavior.BehaviorSet;
import ai.labs.memory.IConversationMemory;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
import java.util.*;
@@ -12,7 +10,6 @@
/**
* @author ginccc
*/
-@NoArgsConstructor
public class Connector implements IExtension {
public static final String ID = "connector";
private final String operatorQualifier = "operator";
@@ -21,18 +18,32 @@ public enum Operator {
OR, AND
}
- private Operator operator;
+ protected Operator operator;
- @Getter
- @Setter
- private List extensions = new LinkedList<>();
+ private List extensions = new LinkedList();
private ExecutionState state = ExecutionState.NOT_EXECUTED;
- private Connector(Operator operator) {
+ public Connector() {
+ this(Operator.OR); // default: OR
+ }
+
+ public Connector(String operator) {
+ this(operator.equals("or") ? Operator.OR : Operator.AND);
+ }
+
+ public Connector(Operator operator) {
this.operator = operator;
}
+ public void setExtensions(List extensions) {
+ this.extensions = extensions;
+ }
+
+ public void addExecutable(IExtension extension) {
+ extensions.add(extension);
+ }
+
@Override
public String getId() {
return ID;
@@ -40,7 +51,7 @@ public String getId() {
@Override
public Map getValues() {
- Map values = new HashMap<>();
+ Map values = new HashMap();
values.put(operatorQualifier, operator.name());
return values;
}
@@ -65,8 +76,7 @@ public IExtension[] getChildren() {
return extensions.toArray(new IExtension[extensions.size()]);
}
- public ExecutionState execute(IConversationMemory memory, List trace)
- throws BehaviorRule.InfiniteLoopException {
+ public ExecutionState execute(IConversationMemory memory, List trace) {
if (operator == Operator.OR) {
state = ExecutionState.FAIL;
@@ -112,7 +122,7 @@ public ExecutionState getExecutionState() {
public IExtension clone() throws CloneNotSupportedException {
Connector clone = new Connector(operator);
- List extensionClone = new LinkedList<>();
+ List extensionClone = new LinkedList();
for (IExtension extension : extensions) {
extensionClone.add(extension.clone());
}
@@ -127,4 +137,9 @@ public IExtension clone() throws CloneNotSupportedException {
public void setChildren(IExtension... extensions) {
this.extensions.addAll(Arrays.asList(extensions));
}
+
+ @Override
+ public void setContainingBehaviorRuleSet(BehaviorSet behaviorSet) {
+ //not implemented
+ }
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Dependency.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Dependency.java
index 5af270625..82e88d17c 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Dependency.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Dependency.java
@@ -4,7 +4,6 @@
import ai.labs.core.behavior.BehaviorRule;
import ai.labs.core.behavior.BehaviorSet;
import ai.labs.memory.IConversationMemory;
-import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
@@ -16,7 +15,6 @@
* @author ginccc
*/
@Slf4j
-@NoArgsConstructor
public class Dependency implements IExtension {
public static final String ID = "dependency";
@@ -26,7 +24,11 @@ public class Dependency implements IExtension {
private final String referenceQualifier = "reference";
private BehaviorSet behaviorSet;
- private Dependency(String referencedRuleName) {
+ public Dependency() {
+ // empty default constructor
+ }
+
+ public Dependency(String referencedRuleName) {
this.reference = referencedRuleName;
}
@@ -52,8 +54,12 @@ public void setValues(Map values) {
}
@Override
- public ExecutionState execute(IConversationMemory memory, List trace)
- throws BehaviorRule.InfiniteLoopException {
+ public IExtension[] getChildren() {
+ return new IExtension[0];
+ }
+
+ @Override
+ public ExecutionState execute(IConversationMemory memory, List trace) {
//before we execute the behavior rules we make deep copies, so that we don't change the rules in conversation memory!
List filteredBehaviorRules = new LinkedList();
@@ -116,6 +122,11 @@ private List cloneBehaviorRules(List behaviorRules,
return clone;
}
+ @Override
+ public void setChildren(IExtension... extensions) {
+ //not
+ }
+
@Override
public void setContainingBehaviorRuleSet(BehaviorSet behaviorSet) {
this.behaviorSet = behaviorSet;
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/IExtension.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/IExtension.java
index 87e103e1d..90ffac7da 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/extensions/IExtension.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/IExtension.java
@@ -17,17 +17,11 @@ public interface IExtension extends Cloneable {
void setValues(Map values);
- default IExtension[] getChildren() {
- return new IExtension[0];
- }
+ IExtension[] getChildren();
- default void setChildren(IExtension... extensions) {
- // not implemented
- }
+ void setChildren(IExtension... extensions);
- default void setContainingBehaviorRuleSet(BehaviorSet behaviorSet) {
- // not implemented
- }
+ void setContainingBehaviorRuleSet(BehaviorSet behaviorSet);
enum ExecutionState {
SUCCESS,
@@ -36,7 +30,7 @@ enum ExecutionState {
ERROR
}
- ExecutionState execute(IConversationMemory memory, List trace) throws BehaviorRule.InfiniteLoopException;
+ ExecutionState execute(IConversationMemory memory, List trace);
ExecutionState getExecutionState();
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/InputMatcher.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/InputMatcher.java
index 6e7a25d7f..cba4c16bd 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/extensions/InputMatcher.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/InputMatcher.java
@@ -1,6 +1,7 @@
package ai.labs.core.behavior.extensions;
import ai.labs.core.behavior.BehaviorRule;
+import ai.labs.core.behavior.BehaviorSet;
import ai.labs.expressions.Expression;
import ai.labs.expressions.utilities.IExpressionProvider;
import ai.labs.memory.IConversationMemory;
@@ -27,10 +28,10 @@ public class InputMatcher implements IExtension {
private boolean ignorePunctuationExpressions = false;
private ExecutionState state = ExecutionState.NOT_EXECUTED;
private final String expressionsQualifier = "expressions";
- private IExpressionProvider expressionProvider;
+ private IExpressionProvider expressionUtilities;
public InputMatcher() {
- expressionProvider = DependencyInjector.getInstance().getInstance(IExpressionProvider.class);
+ expressionUtilities = DependencyInjector.getInstance().getInstance(IExpressionProvider.class);
}
public InputMatcher(List expression) {
@@ -63,7 +64,7 @@ public Map getValues() {
public void setValues(Map values) {
if (values != null && !values.isEmpty()) {
if (values.containsKey(expressionsQualifier)) {
- expressions = expressionProvider.parseExpressions(values.get(expressionsQualifier));
+ expressions = expressionUtilities.parseExpressions(values.get(expressionsQualifier));
}
/*if (values.containsKey(contextQualifier))
@@ -81,12 +82,17 @@ public void setValues(Map values) {
}
}
+ @Override
+ public IExtension[] getChildren() {
+ return new IExtension[0];
+ }
+
@Override
public ExecutionState execute(IConversationMemory memory, List trace) {
List inputExpressions;
IData data = memory.getCurrentStep().getLatestData("expression");
- inputExpressions = data != null ? expressionProvider.parseExpressions(data.getResult().toString()) : new LinkedList<>();
+ inputExpressions = data != null ? expressionUtilities.parseExpressions(data.getResult().toString()) : new LinkedList<>();
inputExpressions = filterExpressions(inputExpressions);
boolean isInputEmpty = expressions.size() == 1 &&
@@ -148,4 +154,14 @@ public IExtension clone() throws CloneNotSupportedException {
clone.setValues(getValues());
return clone;
}
+
+ @Override
+ public void setChildren(IExtension... extensions) {
+ //not implemented
+ }
+
+ @Override
+ public void setContainingBehaviorRuleSet(BehaviorSet behaviorSet) {
+ //not implemented
+ }
}
\ No newline at end of file
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Negation.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Negation.java
index 677451460..23d7aead7 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Negation.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Negation.java
@@ -3,7 +3,6 @@
import ai.labs.core.behavior.BehaviorRule;
import ai.labs.core.behavior.BehaviorSet;
import ai.labs.memory.IConversationMemory;
-import lombok.NoArgsConstructor;
import java.util.Collections;
import java.util.List;
@@ -12,12 +11,18 @@
/**
* @author ginccc
*/
-@NoArgsConstructor
public class Negation implements IExtension {
public static final String ID = "negation";
private IExtension extension;
private ExecutionState state = ExecutionState.NOT_EXECUTED;
+ public Negation() {
+ }
+
+ public Negation(IExtension extension) {
+ this.extension = extension;
+ }
+
@Override
public String getId() {
return ID;
@@ -39,8 +44,7 @@ public IExtension[] getChildren() {
}
@Override
- public ExecutionState execute(IConversationMemory memory, List trace)
- throws BehaviorRule.InfiniteLoopException {
+ public ExecutionState execute(IConversationMemory memory, List trace) {
if (extension != null) {
ExecutionState stateOfExecutable = extension.execute(memory, trace);
@@ -59,7 +63,7 @@ public ExecutionState getExecutionState() {
return state;
}
- private void setExtension(IExtension extension) {
+ public void setExtension(IExtension extension) {
this.extension = extension;
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Occurrence.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Occurrence.java
index b81fc662d..8779d986d 100644
--- a/coreserver/src/main/java/ai/labs/core/behavior/extensions/Occurrence.java
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/Occurrence.java
@@ -1,9 +1,9 @@
package ai.labs.core.behavior.extensions;
import ai.labs.core.behavior.BehaviorRule;
+import ai.labs.core.behavior.BehaviorSet;
import ai.labs.memory.IConversationMemory;
import ai.labs.memory.IData;
-import lombok.NoArgsConstructor;
import java.util.HashMap;
import java.util.LinkedList;
@@ -13,7 +13,6 @@
/**
* @author ginccc
*/
-@NoArgsConstructor
public class Occurrence implements IExtension {
public static final String ID = "occurrence";
private static final String BEHAVIOR_RULES_SUCCESS = "behavior_rules:success";
@@ -26,15 +25,18 @@ public class Occurrence implements IExtension {
private ExecutionState state = ExecutionState.NOT_EXECUTED;
+ public Occurrence() {
+ }
+
public void setBehaviorRuleName(String behaviorRuleName) {
this.behaviorRuleName = behaviorRuleName;
}
- private void setMaxOccurrence(int maxOccurrence) {
+ public void setMaxOccurrence(int maxOccurrence) {
this.maxOccurrence = maxOccurrence;
}
- private int countOccurrences(List> allBehaviorRulesHistorical) {
+ public int countOccurrences(List> allBehaviorRulesHistorical) {
int occurrences = 0;
for (List history : allBehaviorRulesHistorical) {
for (String behaviorRuleName : history) {
@@ -47,11 +49,11 @@ private int countOccurrences(List> allBehaviorRulesHistorical) {
return occurrences;
}
- private List> getAllBehaviorRules(List>>> allData) {
- List> allBehaviorRules = new LinkedList<>();
- for (List>> dataList : allData) {
- for (IData> data : dataList) {
- allBehaviorRules.add(data.getResult());
+ private List> getAllBehaviorRules(List> allData) {
+ List> allBehaviorRules = new LinkedList>();
+ for (List dataList : allData) {
+ for (IData data : dataList) {
+ allBehaviorRules.add((List) data.getResult());
}
}
@@ -65,7 +67,7 @@ public String getId() {
@Override
public Map getValues() {
- HashMap result = new HashMap<>();
+ HashMap result = new HashMap();
result.put(maxOccurrenceQualifier, String.valueOf(maxOccurrence));
result.put(behaviorRuleNameQualifier, behaviorRuleName);
return result;
@@ -89,10 +91,20 @@ public void setValues(Map values) {
}
}
+ @Override
+ public IExtension[] getChildren() {
+ return new IExtension[0];
+ }
+
+ @Override
+ public void setChildren(IExtension... extensions) {
+ //not implemented
+ }
+
@Override
public ExecutionState execute(IConversationMemory memory, List trace) {
boolean success;
- List>>> allData = memory.getAllSteps().getAllData(BEHAVIOR_RULES_SUCCESS);
+ List> allData = memory.getAllSteps().getAllData(BEHAVIOR_RULES_SUCCESS);
if (allData != null) {
int actualOccurrences = countOccurrences(getAllBehaviorRules(allData));
if (maxOccurrence == -1) {
@@ -126,4 +138,9 @@ public IExtension clone() throws CloneNotSupportedException {
return occurrence;
}
+
+ @Override
+ public void setContainingBehaviorRuleSet(BehaviorSet behaviorSet) {
+ //not implemented
+ }
}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/OutputReference.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/OutputReference.java
new file mode 100644
index 000000000..86e6da73f
--- /dev/null
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/OutputReference.java
@@ -0,0 +1,147 @@
+package ai.labs.core.behavior.extensions;
+
+import ai.labs.core.behavior.BehaviorRule;
+import ai.labs.core.behavior.BehaviorSet;
+import ai.labs.expressions.Expression;
+import ai.labs.expressions.utilities.IExpressionProvider;
+import ai.labs.memory.IConversationMemory;
+import ai.labs.runtime.DependencyInjector;
+import ai.labs.utilities.CharacterUtilities;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author ginccc
+ */
+public class OutputReference implements IExtension {
+ public static final String PART = "part";
+ public static final String EQUAL = "equal";
+
+ private List filter; // any expression which should be checked; '*' is allowed
+ private String inputValue = ""; // part|equal
+ private String sessionValue = ""; // part|equal
+
+ private ExecutionState state = ExecutionState.NOT_EXECUTED;
+ private IConversationMemory memory;
+ public static final String ID = "outputReference";
+ private final String inputValueQualifier = "inputValue";
+ private final String sessionValueQualifier = "sessionValue";
+ private final String filterQualifier = "filter";
+ private IExpressionProvider expressionUtilities;
+
+ public OutputReference() {
+ //empty default constructor
+ expressionUtilities = DependencyInjector.getInstance().getInstance(IExpressionProvider.class);
+ }
+
+ public OutputReference(List filter, String inputValue, String sessionValue) {
+ this.filter = filter;
+ this.inputValue = inputValue;
+ this.sessionValue = sessionValue;
+ }
+
+ @Override
+ public String getId() {
+ return ID;
+ }
+
+ @Override
+ public Map getValues() {
+ Map values = new HashMap();
+
+ values.put(inputValueQualifier, inputValue);
+ values.put(sessionValueQualifier, sessionValue);
+ values.put(filterQualifier, CharacterUtilities.arrayToString(filter, ","));
+
+ return values;
+ }
+
+ @Override
+ public void setValues(Map values) {
+ if (values != null && !values.isEmpty()) {
+ if (values.containsKey(inputValueQualifier)) {
+ inputValue = values.get(inputValueQualifier);
+ }
+
+ if (values.containsKey(sessionValueQualifier)) {
+ sessionValue = values.get(sessionValueQualifier);
+ }
+
+ if (values.containsKey(filterQualifier)) {
+ filter = expressionUtilities.parseExpressions(values.get(filterQualifier));
+ }
+ }
+ }
+
+ @Override
+ public IExtension[] getChildren() {
+ return new IExtension[0];
+ }
+
+ @Override
+ public ExecutionState execute(IConversationMemory memory, List trace) {
+ /* todo
+ if(inputValue.equals("") && sessionValue.equals(""))
+ return ExecutionState.FAIL;
+
+ List outputReferences = filter(filter, session.getConversationMemory().getMergedOutputReferences());
+ List inputExpressions = filter(filter, session.getConversationMemory().getExpression());
+ List sessionExpressions = filter(filter, session.getConversationMemory().getDomain().getAllCurrentProperties());
+
+ boolean input = false;
+ if(inputValue.equals(PART))
+ input = outputReferences.size() > 0 && inputExpressions.size() > 0 && outputReferences.containsAll(inputExpressions);
+ else if(inputValue.equals(EQUAL))
+ input = inputExpressions.equals(outputReferences);
+
+ boolean session = false;
+ if(sessionValue.equals(PART))
+ session = outputReferences.size() > 0 && sessionExpressions.size() > 0 && outputReferences.containsAll(sessionExpressions);
+ else if(sessionValue.equals(EQUAL))
+ session = sessionExpressions.equals(outputReferences);
+
+ if(input || session)
+ state = ExecutionState.SUCCESS;
+ else
+ state = ExecutionState.FAIL;
+ */
+ return state;
+ }
+
+ private List filter(List filter, List list) {
+ List ret = new LinkedList();
+ for (Expression tmp : list)
+ for (Expression exp : filter)
+ if (exp.equals(tmp)) {
+ ret.add(tmp);
+ break;
+ }
+
+ return ret;
+ }
+
+ @Override
+ public ExecutionState getExecutionState() {
+ return state;
+ }
+
+ @Override
+ public IExtension clone() throws CloneNotSupportedException {
+ IExtension outputReference = new OutputReference();
+ outputReference.setValues(getValues());
+ return outputReference;
+ }
+
+ @Override
+ public void setChildren(IExtension... extensions) {
+ //not implemented
+ }
+
+ @Override
+ public void setContainingBehaviorRuleSet(BehaviorSet behaviorSet) {
+ //not implemented
+ }
+}
diff --git a/coreserver/src/main/java/ai/labs/core/behavior/extensions/PropertyMatcher.java b/coreserver/src/main/java/ai/labs/core/behavior/extensions/PropertyMatcher.java
new file mode 100644
index 000000000..fdd09b00b
--- /dev/null
+++ b/coreserver/src/main/java/ai/labs/core/behavior/extensions/PropertyMatcher.java
@@ -0,0 +1,88 @@
+package ai.labs.core.behavior.extensions;
+
+import ai.labs.core.behavior.BehaviorRule;
+import ai.labs.core.behavior.BehaviorSet;
+import ai.labs.expressions.Expression;
+import ai.labs.expressions.utilities.IExpressionProvider;
+import ai.labs.memory.IConversationMemory;
+import ai.labs.runtime.DependencyInjector;
+import ai.labs.utilities.CharacterUtilities;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author ginccc
+ */
+public class PropertyMatcher implements IExtension {
+ public static final String ID = "propertymatcher";
+
+ private List expressions;
+
+ private ExecutionState state = ExecutionState.NOT_EXECUTED;
+ private final String expressionsQualifier = "expressions";
+ private IExpressionProvider expressionUtilities;
+
+ public PropertyMatcher() {
+ // empty default constructor
+ expressionUtilities = DependencyInjector.getInstance().getInstance(IExpressionProvider.class);
+ }
+
+ public PropertyMatcher(List expressions) {
+ this.expressions = expressions;
+ }
+
+ @Override
+ public String getId() {
+ return ID;
+ }
+
+ @Override
+ public Map getValues() {
+ Map