release-2.0.0
This commit is contained in:
parent
2e50dc9e5f
commit
9de4d99ab6
288
pom.xml
288
pom.xml
@ -4,9 +4,9 @@
|
|||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<groupId>org.sadtech.autoresponder</groupId>
|
<groupId>dev.struchkov</groupId>
|
||||||
<artifactId>autoresponder</artifactId>
|
<artifactId>autoresponder</artifactId>
|
||||||
<version>1.10-SNAPSHOT</version>
|
<version>2.0.0</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>Abstract Autoresponder</name>
|
<name>Abstract Autoresponder</name>
|
||||||
@ -20,6 +20,174 @@
|
|||||||
</license>
|
</license>
|
||||||
</licenses>
|
</licenses>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>17</java.version>
|
||||||
|
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||||
|
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
|
||||||
|
<haiti.utils.ver>1.0.2</haiti.utils.ver>
|
||||||
|
|
||||||
|
<junit.ver>5.8.2</junit.ver>
|
||||||
|
<slf4j.ver>1.7.36</slf4j.ver>
|
||||||
|
<jetbrains.annotation.ver>23.0.0</jetbrains.annotation.ver>
|
||||||
|
|
||||||
|
<plugin.maven.compiler.ver>3.9.0</plugin.maven.compiler.ver>
|
||||||
|
<plugin.nexus.staging.ver>1.6.8</plugin.nexus.staging.ver>
|
||||||
|
<plugin.maven.source.ver>3.2.1</plugin.maven.source.ver>
|
||||||
|
<plugin.maven.javadoc.ver>3.3.1</plugin.maven.javadoc.ver>
|
||||||
|
<plugin.maven.surefire.ver>3.0.0-M6</plugin.maven.surefire.ver>
|
||||||
|
<plugin.maven.gpg.ver>3.0.1</plugin.maven.gpg.ver>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
<version>${slf4j.ver}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>dev.struchkov.haiti</groupId>
|
||||||
|
<artifactId>haiti-utils</artifactId>
|
||||||
|
<version>${haiti.utils.ver}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains</groupId>
|
||||||
|
<artifactId>annotations</artifactId>
|
||||||
|
<version>${jetbrains.annotation.ver}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<version>${junit.ver}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.sonatype.plugins</groupId>
|
||||||
|
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||||
|
<version>${plugin.nexus.staging.ver}</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
<serverId>ossrh</serverId>
|
||||||
|
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
|
||||||
|
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>${plugin.maven.source.ver}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar-no-fork</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>${plugin.maven.javadoc.ver}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>${plugin.maven.gpg.ver}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${plugin.maven.compiler.ver}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${plugin.maven.surefire.ver}</version>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<version>${junit.ver}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>release</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.sonatype.plugins</groupId>
|
||||||
|
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
<connection>scm:git:https://github.com/uPagge/autoresponder.git</connection>
|
<connection>scm:git:https://github.com/uPagge/autoresponder.git</connection>
|
||||||
<url>https://github.com/uPagge/autoresponder</url>
|
<url>https://github.com/uPagge/autoresponder</url>
|
||||||
@ -33,124 +201,12 @@
|
|||||||
</snapshotRepository>
|
</snapshotRepository>
|
||||||
</distributionManagement>
|
</distributionManagement>
|
||||||
|
|
||||||
<properties>
|
|
||||||
<junit.ver>4.12</junit.ver>
|
|
||||||
<lombok.ver>1.18.12</lombok.ver>
|
|
||||||
<slf4j.ver>1.7.30</slf4j.ver>
|
|
||||||
</properties>
|
|
||||||
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<version>${junit.ver}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.projectlombok</groupId>
|
|
||||||
<artifactId>lombok</artifactId>
|
|
||||||
<version>${lombok.ver}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>slf4j-api</artifactId>
|
|
||||||
<version>${slf4j.ver}</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<profiles>
|
|
||||||
<profile>
|
|
||||||
<id>release</id>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.sonatype.plugins</groupId>
|
|
||||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
|
||||||
<version>1.6.7</version>
|
|
||||||
<extensions>true</extensions>
|
|
||||||
<configuration>
|
|
||||||
<serverId>ossrh</serverId>
|
|
||||||
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
|
||||||
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-source-plugin</artifactId>
|
|
||||||
<version>2.2.1</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>attach-sources</id>
|
|
||||||
<goals>
|
|
||||||
<goal>jar-no-fork</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
|
||||||
<version>2.9.1</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>attach-javadocs</id>
|
|
||||||
<goals>
|
|
||||||
<goal>jar</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-gpg-plugin</artifactId>
|
|
||||||
<version>1.5</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>sign-artifacts</id>
|
|
||||||
<phase>verify</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>sign</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.sonatype.plugins</groupId>
|
|
||||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
|
||||||
<version>1.6.7</version>
|
|
||||||
<extensions>true</extensions>
|
|
||||||
<configuration>
|
|
||||||
<serverId>ossrh</serverId>
|
|
||||||
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
|
||||||
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</profile>
|
|
||||||
</profiles>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.8.0</version>
|
|
||||||
<configuration>
|
|
||||||
<source>8</source>
|
|
||||||
<target>8</target>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
<developer>
|
<developer>
|
||||||
<id>uPagge</id>
|
<id>uPagge</id>
|
||||||
<name>Struchkov Mark</name>
|
<name>Struchkov Mark</name>
|
||||||
<email>upagge@mail.ru</email>
|
<email>mark@struchkov.dev</email>
|
||||||
<organization>SADTECH</organization>
|
<url>https://mark.struchkov.dev</url>
|
||||||
</developer>
|
</developer>
|
||||||
</developers>
|
</developers>
|
||||||
|
|
||||||
|
@ -1,43 +1,49 @@
|
|||||||
package org.sadtech.autoresponder;
|
package dev.struchkov.autoresponder;
|
||||||
|
|
||||||
import lombok.Getter;
|
import dev.struchkov.autoresponder.compare.UnitPriorityComparator;
|
||||||
import lombok.NonNull;
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
import lombok.Setter;
|
import dev.struchkov.autoresponder.entity.UnitPointer;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import dev.struchkov.autoresponder.service.UnitPointerService;
|
||||||
import org.sadtech.autoresponder.compare.UnitPriorityComparator;
|
import dev.struchkov.autoresponder.util.Message;
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
import dev.struchkov.autoresponder.util.Parser;
|
||||||
import org.sadtech.autoresponder.entity.UnitPointer;
|
import dev.struchkov.haiti.utils.Inspector;
|
||||||
import org.sadtech.autoresponder.service.UnitPointerService;
|
import org.slf4j.Logger;
|
||||||
import org.sadtech.autoresponder.util.Description;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.sadtech.autoresponder.util.Message;
|
|
||||||
import org.sadtech.autoresponder.util.Parser;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isEmpty;
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotEmpty;
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Реализуют основную логику автоответчика.
|
* Реализуют основную логику автоответчика.
|
||||||
*
|
*
|
||||||
* @author upagge [07/07/2019]
|
* @author upagge [07/07/2019]
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
public class AutoResponder<U extends Unit<U>> {
|
||||||
public class AutoResponder<U extends Unit> {
|
|
||||||
|
|
||||||
@Description("Компоратор для сортировки Unit-ов")
|
private static final Logger log = LoggerFactory.getLogger(AutoResponder.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Компоратор для сортировки Unit-ов
|
||||||
|
*/
|
||||||
private static final UnitPriorityComparator UNIT_PRIORITY_COMPARATOR = new UnitPriorityComparator();
|
private static final UnitPriorityComparator UNIT_PRIORITY_COMPARATOR = new UnitPriorityComparator();
|
||||||
|
|
||||||
@Description("Начальные юниты, первый запрос приходит на них")
|
/**
|
||||||
|
* Начальные юниты, первый запрос приходит на них
|
||||||
|
*/
|
||||||
private final Set<U> startUnits;
|
private final Set<U> startUnits;
|
||||||
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@Description("Дефолтный юнит, отправляется если ни один Unit не подошел")
|
|
||||||
private U defaultUnit;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final UnitPointerService<U> unitPointerService;
|
private final UnitPointerService<U> unitPointerService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Дефолтный юнит, отправляется если ни один Unit не подошел
|
||||||
|
*/
|
||||||
|
private U defaultUnit;
|
||||||
|
|
||||||
public AutoResponder(UnitPointerService<U> unitPointerService, Set<U> startUnits) {
|
public AutoResponder(UnitPointerService<U> unitPointerService, Set<U> startUnits) {
|
||||||
this.startUnits = startUnits;
|
this.startUnits = startUnits;
|
||||||
this.unitPointerService = unitPointerService;
|
this.unitPointerService = unitPointerService;
|
||||||
@ -50,7 +56,8 @@ public class AutoResponder<U extends Unit> {
|
|||||||
* @param message Запрос пользователя - текстовое сообщение
|
* @param message Запрос пользователя - текстовое сообщение
|
||||||
* @return {@link Unit}, который отвечает за данные для обработки данного запроса
|
* @return {@link Unit}, который отвечает за данные для обработки данного запроса
|
||||||
*/
|
*/
|
||||||
public Optional<U> answer(@NonNull Long entityId, @NonNull String message) {
|
public Optional<U> answer(Long entityId, String message) {
|
||||||
|
isNotNull(entityId, message);
|
||||||
Optional<UnitPointer<U>> unitPointer = unitPointerService.getByEntityId(entityId);
|
Optional<UnitPointer<U>> unitPointer = unitPointerService.getByEntityId(entityId);
|
||||||
final Optional<U> answer = nextUnit(
|
final Optional<U> answer = nextUnit(
|
||||||
unitPointer.isPresent()
|
unitPointer.isPresent()
|
||||||
@ -62,7 +69,8 @@ public class AutoResponder<U extends Unit> {
|
|||||||
);
|
);
|
||||||
if (answer.isPresent()) {
|
if (answer.isPresent()) {
|
||||||
final U unitAnswer = answer.get();
|
final U unitAnswer = answer.get();
|
||||||
if (unitAnswer.getNextUnits().isEmpty()) {
|
final Set<U> nextUnits = unitAnswer.getNextUnits();
|
||||||
|
if (isEmpty(nextUnits)) {
|
||||||
unitPointerService.removeByEntityId(entityId);
|
unitPointerService.removeByEntityId(entityId);
|
||||||
} else {
|
} else {
|
||||||
unitPointerService.save(new UnitPointer<>(entityId, unitAnswer));
|
unitPointerService.save(new UnitPointer<>(entityId, unitAnswer));
|
||||||
@ -80,30 +88,29 @@ public class AutoResponder<U extends Unit> {
|
|||||||
* @param message Запрос пользователя - текстовое сообщение
|
* @param message Запрос пользователя - текстовое сообщение
|
||||||
* @return Юнит, который нуждается в обработке в соответствии с запросом пользователя
|
* @return Юнит, который нуждается в обработке в соответствии с запросом пользователя
|
||||||
*/
|
*/
|
||||||
private Optional<U> nextUnit(@NonNull Set<U> nextUnits, @NonNull String message) {
|
private Optional<U> nextUnit(Set<U> nextUnits, String message) {
|
||||||
Set<U> searchUnit = new HashSet<>();
|
isNotNull(nextUnits, message);
|
||||||
|
final Set<U> searchUnit = new HashSet<>();
|
||||||
|
|
||||||
|
if (isNotEmpty(nextUnits)) {
|
||||||
for (U unit : nextUnits) {
|
for (U unit : nextUnits) {
|
||||||
if (unit.getPhrase() != null
|
if (unit.getPhrase() != null
|
||||||
&& !unit.getPhrase().isEmpty()
|
&& !unit.getPhrase().isEmpty()
|
||||||
&& unit.getPhrase().equalsIgnoreCase(message)) {
|
&& unit.getPhrase().equalsIgnoreCase(message)) {
|
||||||
searchUnit.add(unit);
|
searchUnit.add(unit);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (U unit : nextUnits) {
|
|
||||||
if (unit.getPattern() != null && patternReg(unit, message)) {
|
if (unit.getPattern() != null && patternReg(unit, message)) {
|
||||||
searchUnit.add(unit);
|
searchUnit.add(unit);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (U unit : nextUnits) {
|
|
||||||
if (percentageMatch(unit, Parser.parse(message)) >= unit.getMatchThreshold()) {
|
if (percentageMatch(unit, Parser.parse(message)) >= unit.getMatchThreshold()) {
|
||||||
searchUnit.add(unit);
|
searchUnit.add(unit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (searchUnit.isEmpty()) {
|
if (isEmpty(searchUnit)) {
|
||||||
for (U nextUnit : nextUnits) {
|
for (U nextUnit : nextUnits) {
|
||||||
if ((nextUnit.getPattern() == null && (nextUnit.getKeyWords() == null || nextUnit.getKeyWords().isEmpty()))) {
|
if ((nextUnit.getPattern() == null && (nextUnit.getKeyWords() == null || nextUnit.getKeyWords().isEmpty()))) {
|
||||||
searchUnit.add(nextUnit);
|
searchUnit.add(nextUnit);
|
||||||
@ -113,14 +120,15 @@ public class AutoResponder<U extends Unit> {
|
|||||||
return searchUnit.stream().max(UNIT_PRIORITY_COMPARATOR);
|
return searchUnit.stream().max(UNIT_PRIORITY_COMPARATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean patternReg(@NonNull U unit, String message) {
|
private boolean patternReg(U unit, String message) {
|
||||||
|
isNotNull(unit);
|
||||||
return message.matches(unit.getPattern().pattern());
|
return message.matches(unit.getPattern().pattern());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Double percentageMatch(U unit, Set<String> words) {
|
private Double percentageMatch(U unit, Set<String> words) {
|
||||||
Set<String> keyWords = unit.getKeyWords();
|
final Set<String> keyWords = unit.getKeyWords();
|
||||||
if (keyWords != null && !keyWords.isEmpty()) {
|
if (keyWords != null && !keyWords.isEmpty()) {
|
||||||
Set<String> temp = new HashSet<>(keyWords);
|
final Set<String> temp = new HashSet<>(keyWords);
|
||||||
temp.retainAll(words);
|
temp.retainAll(words);
|
||||||
log.trace(Message.UNIT_KEYWORDS, keyWords, keyWords.size());
|
log.trace(Message.UNIT_KEYWORDS, keyWords, keyWords.size());
|
||||||
log.trace(Message.USER_MESSAGE_KEYWORDS, words);
|
log.trace(Message.USER_MESSAGE_KEYWORDS, words);
|
||||||
@ -132,4 +140,20 @@ public class AutoResponder<U extends Unit> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UnitPointerService<U> getUnitPointerService() {
|
||||||
|
return unitPointerService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<U> getStartUnits() {
|
||||||
|
return startUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public U getDefaultUnit() {
|
||||||
|
return defaultUnit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDefaultUnit(U defaultUnit) {
|
||||||
|
this.defaultUnit = defaultUnit;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
package org.sadtech.autoresponder.compare;
|
package dev.struchkov.autoresponder.compare;
|
||||||
|
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
|
131
src/main/java/dev/struchkov/autoresponder/entity/Unit.java
Normal file
131
src/main/java/dev/struchkov/autoresponder/entity/Unit.java
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
package dev.struchkov.autoresponder.entity;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Абстрактная сущность, отвечающая за хранение данных, необходимая для обработки запроса.
|
||||||
|
*
|
||||||
|
* @author upagge [07/07/2019]
|
||||||
|
*/
|
||||||
|
public abstract class Unit<U extends Unit<U>> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ключевые слова.
|
||||||
|
*/
|
||||||
|
protected Set<String> keyWords = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Точная фраза.
|
||||||
|
*/
|
||||||
|
protected String phrase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Регулярное выражение.
|
||||||
|
*/
|
||||||
|
protected Pattern pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Значение минимального отношения количества найденых ключевых слов, к количеству ключевых слов Unit-а.
|
||||||
|
*/
|
||||||
|
protected Integer matchThreshold;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Значение приоритета.
|
||||||
|
*/
|
||||||
|
protected Integer priority;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Множество следующих Unit в сценарии.
|
||||||
|
*/
|
||||||
|
protected Set<U> nextUnits = new HashSet<>();
|
||||||
|
|
||||||
|
protected Unit(Set<String> keyWords,
|
||||||
|
String phrase,
|
||||||
|
Pattern pattern,
|
||||||
|
Integer matchThreshold,
|
||||||
|
Integer priority,
|
||||||
|
Set<U> nextUnits) {
|
||||||
|
this.keyWords = keyWords;
|
||||||
|
this.phrase = phrase;
|
||||||
|
this.pattern = pattern;
|
||||||
|
this.matchThreshold = matchThreshold == null ? 10 : matchThreshold;
|
||||||
|
this.priority = priority == null ? 10 : priority;
|
||||||
|
this.nextUnits = nextUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getKeyWords() {
|
||||||
|
return keyWords;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKeyWords(Set<String> keyWords) {
|
||||||
|
this.keyWords = keyWords;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPhrase() {
|
||||||
|
return phrase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhrase(String phrase) {
|
||||||
|
this.phrase = phrase;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pattern getPattern() {
|
||||||
|
return pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPattern(Pattern pattern) {
|
||||||
|
this.pattern = pattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMatchThreshold() {
|
||||||
|
return matchThreshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMatchThreshold(Integer matchThreshold) {
|
||||||
|
this.matchThreshold = matchThreshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPriority() {
|
||||||
|
return priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPriority(Integer priority) {
|
||||||
|
this.priority = priority;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<U> getNextUnits() {
|
||||||
|
return nextUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNextUnits(Set<U> nextUnits) {
|
||||||
|
this.nextUnits = nextUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
Unit<?> unit = (Unit<?>) o;
|
||||||
|
return Objects.equals(keyWords, unit.keyWords) && Objects.equals(phrase, unit.phrase) && Objects.equals(pattern, unit.pattern) && Objects.equals(matchThreshold, unit.matchThreshold) && Objects.equals(priority, unit.priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(keyWords, phrase, pattern, matchThreshold, priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Unit{" +
|
||||||
|
"keyWords=" + keyWords +
|
||||||
|
", phrase='" + phrase + '\'' +
|
||||||
|
", pattern=" + pattern +
|
||||||
|
", matchThreshold=" + matchThreshold +
|
||||||
|
", priority=" + priority +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package dev.struchkov.autoresponder.entity;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сущность для сохранения позиции пользователя в сценарии, состоящем из связного списка элементов {@link Unit}.
|
||||||
|
*
|
||||||
|
* @author upagge [07/07/2019]
|
||||||
|
*/
|
||||||
|
public class UnitPointer<U extends Unit<U>> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Идентификатор пользователя.
|
||||||
|
*/
|
||||||
|
private Long entityId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Юнит, который был обработан.
|
||||||
|
*/
|
||||||
|
private U unit;
|
||||||
|
|
||||||
|
public UnitPointer(Long entityId, U unit) {
|
||||||
|
this.entityId = entityId;
|
||||||
|
this.unit = unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getEntityId() {
|
||||||
|
return entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEntityId(Long entityId) {
|
||||||
|
this.entityId = entityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public U getUnit() {
|
||||||
|
return unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUnit(U unit) {
|
||||||
|
this.unit = unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
UnitPointer<?> that = (UnitPointer<?>) o;
|
||||||
|
return Objects.equals(entityId, that.entityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(entityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
package dev.struchkov.autoresponder.repository;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
import dev.struchkov.autoresponder.entity.UnitPointer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Интегрфейс для работы с хранилищем сущности {@link UnitPointer}.
|
||||||
|
*
|
||||||
|
* @author upagge [07/07/2019]
|
||||||
|
*/
|
||||||
|
public interface UnitPointerRepository<U extends Unit<U>> {
|
||||||
|
|
||||||
|
UnitPointer<U> save(@NotNull UnitPointer<U> unitPointer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param entityId Идентификатор пользователя
|
||||||
|
* @return Объект с последним обработанным {@link Unit} для пользователя
|
||||||
|
*/
|
||||||
|
Optional<UnitPointer<U>> findByEntityId(Long entityId);
|
||||||
|
|
||||||
|
void removeByEntityId(Long entityId);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package dev.struchkov.autoresponder.repository;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
import dev.struchkov.autoresponder.entity.UnitPointer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Реализация хранилища для {@link UnitPointer} на основе Map.
|
||||||
|
*
|
||||||
|
* @author upagge [07/07/2019]
|
||||||
|
*/
|
||||||
|
public class UnitPointerRepositoryMap<U extends Unit<U>> implements UnitPointerRepository<U> {
|
||||||
|
|
||||||
|
private final Map<Long, UnitPointer<U>> unitPointerMap = new HashMap<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UnitPointer<U> save(@NotNull UnitPointer<U> unitPointer) {
|
||||||
|
// isNotNull(unitPointer);
|
||||||
|
unitPointerMap.put(unitPointer.getEntityId(), unitPointer);
|
||||||
|
return unitPointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<UnitPointer<U>> findByEntityId(Long entityId) {
|
||||||
|
isNotNull(entityId);
|
||||||
|
return Optional.ofNullable(unitPointerMap.get(entityId));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeByEntityId(Long entityId) {
|
||||||
|
isNotNull(entityId);
|
||||||
|
unitPointerMap.remove(entityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package dev.struchkov.autoresponder.service;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
import dev.struchkov.autoresponder.entity.UnitPointer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сервис для взаимодействия с сущностью {@link UnitPointer}.
|
||||||
|
*
|
||||||
|
* @author upagge [07/07/2019]
|
||||||
|
*/
|
||||||
|
public interface UnitPointerService<U extends Unit<U>> {
|
||||||
|
|
||||||
|
void save(@NotNull UnitPointer<U> unitPointer);
|
||||||
|
|
||||||
|
Optional<UnitPointer<U>> getByEntityId(@NotNull Long entityId);
|
||||||
|
|
||||||
|
void removeByEntityId(@NotNull Long entityId);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package dev.struchkov.autoresponder.service;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
import dev.struchkov.autoresponder.entity.UnitPointer;
|
||||||
|
import dev.struchkov.autoresponder.repository.UnitPointerRepository;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||||
|
|
||||||
|
public class UnitPointerServiceImpl<U extends Unit<U>> implements UnitPointerService<U> {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(UnitPointerServiceImpl.class);
|
||||||
|
|
||||||
|
private final UnitPointerRepository<U> unitPointerRepository;
|
||||||
|
|
||||||
|
public UnitPointerServiceImpl(UnitPointerRepository<U> unitPointerRepository) {
|
||||||
|
this.unitPointerRepository = unitPointerRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<UnitPointer<U>> getByEntityId(@NotNull Long entityId) {
|
||||||
|
isNotNull(entityId);
|
||||||
|
return unitPointerRepository.findByEntityId(entityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeByEntityId(@NotNull Long entityId) {
|
||||||
|
isNotNull(entityId);
|
||||||
|
unitPointerRepository.removeByEntityId(entityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save(@NotNull UnitPointer<U> unitPointer) {
|
||||||
|
isNotNull(unitPointer);
|
||||||
|
unitPointerRepository.save(unitPointer);
|
||||||
|
log.trace("Пользователь отправлен в репозиторий");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.sadtech.autoresponder.util;
|
package dev.struchkov.autoresponder.util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Класс содержащий сообщения для ошибок и логера.
|
* Класс содержащий сообщения для ошибок и логера.
|
40
src/main/java/dev/struchkov/autoresponder/util/Parser.java
Normal file
40
src/main/java/dev/struchkov/autoresponder/util/Parser.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package dev.struchkov.autoresponder.util;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static dev.struchkov.autoresponder.util.Message.UTILITY_CLASS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Разбивает строку на множество слов, удаляя предлоги.
|
||||||
|
*
|
||||||
|
* @author upagge [07/07/2019]
|
||||||
|
*/
|
||||||
|
public class Parser {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Множество предлогов.
|
||||||
|
*/
|
||||||
|
private static final Set<String> pretexts = Set.of(
|
||||||
|
"в", "без", "до", "из", "к", "на", "по", "о", "от", "перед", "при", "с", "у", "за", "над", "об",
|
||||||
|
"под", "про", "для");
|
||||||
|
|
||||||
|
private Parser() {
|
||||||
|
throw new IllegalStateException(UTILITY_CLASS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Метод по разбиению строки на множество слов.
|
||||||
|
*
|
||||||
|
* @param text Строка
|
||||||
|
* @return Множество слов
|
||||||
|
*/
|
||||||
|
public static Set<String> parse(String text) {
|
||||||
|
final String[] split = text.split("\\P{L}+");
|
||||||
|
final Set<String> words = Arrays.stream(split).map(String::toLowerCase).collect(Collectors.toSet());
|
||||||
|
words.removeAll(pretexts);
|
||||||
|
return words;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
39
src/main/java/dev/struchkov/autoresponder/util/Units.java
Normal file
39
src/main/java/dev/struchkov/autoresponder/util/Units.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package dev.struchkov.autoresponder.util;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static dev.struchkov.haiti.utils.Exceptions.utilityClass;
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotEmpty;
|
||||||
|
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Утилитарный класс с полезными методами для работы с юнитами.
|
||||||
|
*/
|
||||||
|
public class Units {
|
||||||
|
|
||||||
|
private Units() {
|
||||||
|
utilityClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Позволяет связать два разных юнита. Используется, чтобы побороть циклические зависимости в различных фреймворках.
|
||||||
|
*
|
||||||
|
* @param first К этому юниту будет присоединен юнит second.
|
||||||
|
* @param second Этот юнит присоединяется после first.
|
||||||
|
*/
|
||||||
|
public static void link(Unit first, Unit second) {
|
||||||
|
isNotNull(first, second);
|
||||||
|
final Set<Unit> nextUnits = first.getNextUnits();
|
||||||
|
if (isNotEmpty(nextUnits)) {
|
||||||
|
nextUnits.add(second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void link(Unit first, Unit... other) {
|
||||||
|
isNotNull(first);
|
||||||
|
isNotEmpty(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
6
src/main/java/module-info.java
Normal file
6
src/main/java/module-info.java
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module autoresponder.copy {
|
||||||
|
requires haiti.utils;
|
||||||
|
|
||||||
|
requires org.slf4j;
|
||||||
|
requires org.jetbrains.annotations;
|
||||||
|
}
|
@ -1,55 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.entity;
|
|
||||||
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import lombok.ToString;
|
|
||||||
import org.sadtech.autoresponder.util.Description;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Абстрактная сущность, отвечающая за хранение данных, необходимая для обработки запроса.
|
|
||||||
*
|
|
||||||
* @author upagge [07/07/2019]
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
@EqualsAndHashCode
|
|
||||||
@ToString
|
|
||||||
@Setter
|
|
||||||
public abstract class Unit<U extends Unit> {
|
|
||||||
|
|
||||||
@Description("Ключевые слова")
|
|
||||||
protected Set<String> keyWords;
|
|
||||||
|
|
||||||
@Description("Точная фраза")
|
|
||||||
protected String phrase;
|
|
||||||
|
|
||||||
@Description("Регулярное выражение")
|
|
||||||
protected Pattern pattern;
|
|
||||||
|
|
||||||
@Description("Значение минимального отношения количества найденых ключевых слов, к количеству ключевых слов Unit-а")
|
|
||||||
protected Integer matchThreshold;
|
|
||||||
|
|
||||||
@Description("Значение приоритета")
|
|
||||||
protected Integer priority;
|
|
||||||
|
|
||||||
@Description("Множество следующих Unit в сценарии")
|
|
||||||
protected Set<U> nextUnits;
|
|
||||||
|
|
||||||
protected Unit(Set<String> keyWords,
|
|
||||||
String phrase,
|
|
||||||
Pattern pattern,
|
|
||||||
Integer matchThreshold,
|
|
||||||
Integer priority,
|
|
||||||
Set<U> nextUnits) {
|
|
||||||
this.keyWords = keyWords;
|
|
||||||
this.phrase = phrase;
|
|
||||||
this.pattern = pattern;
|
|
||||||
this.matchThreshold = matchThreshold == null ? 10 : matchThreshold;
|
|
||||||
this.priority = priority == null ? 10 : priority;
|
|
||||||
this.nextUnits = nextUnits;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.entity;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Setter;
|
|
||||||
import org.sadtech.autoresponder.util.Description;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Сущность для сохранения позиции пользователя в сценарии, состоящем из связного списка элементов {@link Unit}.
|
|
||||||
*
|
|
||||||
* @author upagge [07/07/2019]
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
@Setter
|
|
||||||
@AllArgsConstructor
|
|
||||||
@EqualsAndHashCode(of = "entityId")
|
|
||||||
public class UnitPointer<U extends Unit> {
|
|
||||||
|
|
||||||
@Description("Идентификатор пользователя")
|
|
||||||
private Long entityId;
|
|
||||||
|
|
||||||
@Description("Юнит, который был обработан")
|
|
||||||
private U unit;
|
|
||||||
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.repository;
|
|
||||||
|
|
||||||
import lombok.NonNull;
|
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
|
||||||
import org.sadtech.autoresponder.entity.UnitPointer;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Интегрфейс для работы с хранилищем сущности {@link UnitPointer}.
|
|
||||||
*
|
|
||||||
* @author upagge [07/07/2019]
|
|
||||||
*/
|
|
||||||
public interface UnitPointerRepository<U extends Unit> {
|
|
||||||
|
|
||||||
UnitPointer<U> save(@NonNull UnitPointer<U> unitPointer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param entityId Идентификатор пользователя
|
|
||||||
* @return Объект с последним обработанным {@link Unit} для пользователя
|
|
||||||
*/
|
|
||||||
Optional<UnitPointer<U>> findByEntityId(@NonNull Long entityId);
|
|
||||||
|
|
||||||
void removeByEntityId(@NonNull Long entityId);
|
|
||||||
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.repository;
|
|
||||||
|
|
||||||
import lombok.NonNull;
|
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
|
||||||
import org.sadtech.autoresponder.entity.UnitPointer;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Реализация хранилища для {@link UnitPointer} на основе Map.
|
|
||||||
*
|
|
||||||
* @author upagge [07/07/2019]
|
|
||||||
*/
|
|
||||||
public class UnitPointerRepositoryMap<U extends Unit> implements UnitPointerRepository<U> {
|
|
||||||
|
|
||||||
private Map<Long, UnitPointer<U>> unitPointerMap = new HashMap<>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public UnitPointer<U> save(@NonNull UnitPointer<U> unitPointer) {
|
|
||||||
unitPointerMap.put(unitPointer.getEntityId(), unitPointer);
|
|
||||||
return unitPointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<UnitPointer<U>> findByEntityId(@NonNull Long entityId) {
|
|
||||||
return Optional.ofNullable(unitPointerMap.get(entityId));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeByEntityId(@NonNull Long entityId) {
|
|
||||||
unitPointerMap.remove(entityId);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.service;
|
|
||||||
|
|
||||||
import lombok.NonNull;
|
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
|
||||||
import org.sadtech.autoresponder.entity.UnitPointer;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Сервис для взаимодействия с сущностью {@link UnitPointer}.
|
|
||||||
*
|
|
||||||
* @author upagge [07/07/2019]
|
|
||||||
*/
|
|
||||||
public interface UnitPointerService<U extends Unit> {
|
|
||||||
|
|
||||||
void save(@NonNull UnitPointer<U> unitPointer);
|
|
||||||
|
|
||||||
Optional<UnitPointer<U>> getByEntityId(@NonNull Long entityId);
|
|
||||||
|
|
||||||
void removeByEntityId(@NonNull Long entityId);
|
|
||||||
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.service;
|
|
||||||
|
|
||||||
import lombok.NonNull;
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
|
||||||
import org.sadtech.autoresponder.entity.UnitPointer;
|
|
||||||
import org.sadtech.autoresponder.repository.UnitPointerRepository;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
public class UnitPointerServiceImpl<U extends Unit> implements UnitPointerService<U> {
|
|
||||||
|
|
||||||
private final UnitPointerRepository<U> unitPointerRepository;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<UnitPointer<U>> getByEntityId(@NonNull Long entityId) {
|
|
||||||
return unitPointerRepository.findByEntityId(entityId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void removeByEntityId(@NonNull Long entityId) {
|
|
||||||
unitPointerRepository.removeByEntityId(entityId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void save(@NonNull UnitPointer<U> unitPointer) {
|
|
||||||
unitPointerRepository.save(unitPointer);
|
|
||||||
log.trace("Пользователь отправлен в репозиторий");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.util;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Служит для описания роли полей в классах.
|
|
||||||
*
|
|
||||||
* @author upagge [07/07/2019]
|
|
||||||
*/
|
|
||||||
@Target(ElementType.FIELD)
|
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
|
||||||
public @interface Description {
|
|
||||||
|
|
||||||
String value() default "";
|
|
||||||
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.util;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static org.sadtech.autoresponder.util.Message.UTILITY_CLASS;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Разбивает строку на множество слов, удаляя предлоги.
|
|
||||||
*
|
|
||||||
* @author upagge [07/07/2019]
|
|
||||||
*/
|
|
||||||
public class Parser {
|
|
||||||
|
|
||||||
@Description("Множество предлогов")
|
|
||||||
private static final Set<String> pretexts = Collections.unmodifiableSet(
|
|
||||||
new HashSet<>(Arrays.asList(
|
|
||||||
"в", "без", "до", "из", "к", "на", "по", "о", "от", "перед", "при", "с", "у", "за", "над", "об",
|
|
||||||
"под", "про", "для"
|
|
||||||
)));
|
|
||||||
|
|
||||||
private Parser() {
|
|
||||||
throw new IllegalStateException(UTILITY_CLASS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Метод по разбиению строки на множество слов.
|
|
||||||
*
|
|
||||||
* @param text Строка
|
|
||||||
* @return Множество слов
|
|
||||||
*/
|
|
||||||
public static Set<String> parse(String text) {
|
|
||||||
String[] split = text.split("\\P{L}+");
|
|
||||||
Set<String> words = Arrays.stream(split).map(String::toLowerCase).collect(Collectors.toSet());
|
|
||||||
words.removeAll(pretexts);
|
|
||||||
return words;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
143
src/test/java/dev/struchkov/autoresponder/AutoResponderTest.java
Normal file
143
src/test/java/dev/struchkov/autoresponder/AutoResponderTest.java
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
package dev.struchkov.autoresponder;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.repository.UnitPointerRepositoryMap;
|
||||||
|
import dev.struchkov.autoresponder.service.UnitPointerServiceImpl;
|
||||||
|
import dev.struchkov.autoresponder.test.TestUnit;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
class AutoResponderTest {
|
||||||
|
|
||||||
|
private AutoResponder<TestUnit> autoresponder;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setUp() {
|
||||||
|
final TestUnit dela = TestUnit.builder()
|
||||||
|
.keyWord("дела")
|
||||||
|
.keyWord("делишки")
|
||||||
|
.message("хорошо")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
final TestUnit delaTop = TestUnit.builder()
|
||||||
|
.priority(100)
|
||||||
|
.keyWord("делишки")
|
||||||
|
.message("отлично")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
final TestUnit hello = TestUnit.builder()
|
||||||
|
.keyWord("привет")
|
||||||
|
.message("тест")
|
||||||
|
.nextUnit(dela)
|
||||||
|
.nextUnit(delaTop)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
final TestUnit number = TestUnit.builder()
|
||||||
|
.keyWord("89101234567")
|
||||||
|
.message("ответ")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
final TestUnit regExp = TestUnit.builder()
|
||||||
|
.pattern(Pattern.compile("^((8|\\+7)[\\- ]?)?(\\(?\\d{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}$"))
|
||||||
|
.message("регулярка")
|
||||||
|
.build();
|
||||||
|
dela.setNextUnits(Stream.of(regExp, number).collect(Collectors.toSet()));
|
||||||
|
|
||||||
|
final Set<String> strings = Stream.of("витамин", "мультифрукт", "арбуз", "параметр").collect(Collectors.toSet());
|
||||||
|
|
||||||
|
final TestUnit unreal = TestUnit.builder()
|
||||||
|
.keyWords(strings)
|
||||||
|
.message("победа")
|
||||||
|
.matchThreshold(100)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
final Set<TestUnit> testUnits = new HashSet<>();
|
||||||
|
testUnits.add(hello);
|
||||||
|
testUnits.add(regExp);
|
||||||
|
testUnits.add(unreal);
|
||||||
|
|
||||||
|
final UnitPointerRepositoryMap<TestUnit> unitPointerRepository = new UnitPointerRepositoryMap<>();
|
||||||
|
final UnitPointerServiceImpl<TestUnit> unitPointerService = new UnitPointerServiceImpl<>(unitPointerRepository);
|
||||||
|
autoresponder = new AutoResponder<>(unitPointerService, testUnits);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void simpleAnswer() {
|
||||||
|
final String message = autoresponder.answer(1L, "привет это тестирвоание функциональности").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("тест", message);
|
||||||
|
final String message1 = autoresponder.answer(2L, "привет, еще одно тестирование").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("тест", message1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void defaultAnswer() {
|
||||||
|
final TestUnit defaultUnit = TestUnit.builder().message("не знаю").build();
|
||||||
|
autoresponder.setDefaultUnit(defaultUnit);
|
||||||
|
|
||||||
|
assertEquals("не знаю", autoresponder.answer(2L, "пока").orElseThrow(NullPointerException::new).getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void notDefaultAnswer() {
|
||||||
|
assertEquals(Optional.empty(), autoresponder.answer(2L, "пока"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void regExpAnswer() {
|
||||||
|
final String message = autoresponder.answer(1L, "79101234567").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("регулярка", message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void priorityAnswer() {
|
||||||
|
autoresponder.answer(1L, "привет");
|
||||||
|
autoresponder.answer(2L, "привет");
|
||||||
|
final String message = autoresponder.answer(1L, "как твои делишки").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("отлично", message);
|
||||||
|
final String message1 = autoresponder.answer(2L, "твои дела все еще хорошо?").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("хорошо", message1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void showRegExpVsKeyWords() {
|
||||||
|
autoresponder.answer(1L, "привет");
|
||||||
|
autoresponder.answer(1L, "дела");
|
||||||
|
assertEquals("регулярка", autoresponder.answer(1L, "89101234567").orElseThrow(NullPointerException::new).getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void matchThreshold() {
|
||||||
|
autoresponder.answer(1L, "витамин я сьем, и арбуз получу");
|
||||||
|
final String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт";
|
||||||
|
final String answer = autoresponder.answer(1L, message).orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("победа", answer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void generalAnswer() {
|
||||||
|
TestUnit defaultUnit = TestUnit.builder().message("не знаю").build();
|
||||||
|
autoresponder.setDefaultUnit(defaultUnit);
|
||||||
|
final String answer = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("тест", answer);
|
||||||
|
assertEquals("хорошо", autoresponder.answer(1L, "как твои дела").orElseThrow(NullPointerException::new).getMessage());
|
||||||
|
final String answer2 = autoresponder.answer(2L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("тест", answer2);
|
||||||
|
assertEquals("не знаю", autoresponder.answer(1L, "нет").orElseThrow(NullPointerException::new).getMessage());
|
||||||
|
final String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт";
|
||||||
|
assertEquals("победа", autoresponder.answer(3L, message).orElseThrow(NullPointerException::new).getMessage());
|
||||||
|
assertEquals("регулярка", autoresponder.answer(1L, "8912345678").orElseThrow(NullPointerException::new).getMessage());
|
||||||
|
final String answer3 = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage();
|
||||||
|
assertEquals("тест", answer3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
108
src/test/java/dev/struchkov/autoresponder/test/TestUnit.java
Normal file
108
src/test/java/dev/struchkov/autoresponder/test/TestUnit.java
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
package dev.struchkov.autoresponder.test;
|
||||||
|
|
||||||
|
import dev.struchkov.autoresponder.entity.Unit;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class TestUnit extends Unit<TestUnit> {
|
||||||
|
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public TestUnit(Set<String> keyWords,
|
||||||
|
String phrase,
|
||||||
|
Pattern pattern,
|
||||||
|
Integer matchThreshold,
|
||||||
|
Integer priority,
|
||||||
|
Set<TestUnit> nextUnits,
|
||||||
|
String message) {
|
||||||
|
super(keyWords, phrase, pattern, matchThreshold, priority, nextUnits);
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TestUnit(Builder builder) {
|
||||||
|
super(builder.keyWords, builder.phrase, builder.pattern, builder.matchThreshold, builder.priority, builder.nextUnits);
|
||||||
|
message = builder.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "TestUnit{" +
|
||||||
|
"keyWords=" + keyWords +
|
||||||
|
", phrase='" + phrase + '\'' +
|
||||||
|
", pattern=" + pattern +
|
||||||
|
", matchThreshold=" + matchThreshold +
|
||||||
|
", priority=" + priority +
|
||||||
|
", message='" + message + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static final class Builder {
|
||||||
|
private Set<String> keyWords = new HashSet<>();
|
||||||
|
private String phrase;
|
||||||
|
private Pattern pattern;
|
||||||
|
private Integer matchThreshold;
|
||||||
|
private Integer priority;
|
||||||
|
private Set<TestUnit> nextUnits = new HashSet<>();
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public Builder keyWords(Set<String> val) {
|
||||||
|
keyWords = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder keyWord(String val) {
|
||||||
|
keyWords.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder phrase(String val) {
|
||||||
|
phrase = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder pattern(Pattern val) {
|
||||||
|
pattern = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder matchThreshold(Integer val) {
|
||||||
|
matchThreshold = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder priority(Integer val) {
|
||||||
|
priority = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder nextUnits(Set<TestUnit> val) {
|
||||||
|
nextUnits = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder nextUnit(TestUnit val) {
|
||||||
|
nextUnits.add(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder message(String val) {
|
||||||
|
message = val;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestUnit build() {
|
||||||
|
return new TestUnit(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,141 +0,0 @@
|
|||||||
package org.sadtech.autoresponder;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.sadtech.autoresponder.repository.UnitPointerRepositoryMap;
|
|
||||||
import org.sadtech.autoresponder.service.UnitPointerServiceImpl;
|
|
||||||
import org.sadtech.autoresponder.test.TestUnit;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public class AutoResponderTest {
|
|
||||||
|
|
||||||
private AutoResponder<TestUnit> autoresponder;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() {
|
|
||||||
TestUnit dela = TestUnit.builder()
|
|
||||||
.keyWord("дела")
|
|
||||||
.keyWord("делишки")
|
|
||||||
.message("хорошо")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
TestUnit delaTop = TestUnit.builder()
|
|
||||||
.priority(100)
|
|
||||||
.keyWord("делишки")
|
|
||||||
.message("отлично")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
TestUnit hello = TestUnit.builder()
|
|
||||||
.keyWord("привет")
|
|
||||||
.message("тест")
|
|
||||||
.nextUnit(dela)
|
|
||||||
.nextUnit(delaTop)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
|
|
||||||
TestUnit number = TestUnit.builder()
|
|
||||||
.keyWord("89101234567")
|
|
||||||
.message("ответ")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
TestUnit regExp = TestUnit.builder()
|
|
||||||
.pattern(Pattern.compile("^((8|\\+7)[\\- ]?)?(\\(?\\d{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}$"))
|
|
||||||
.message("регулярка")
|
|
||||||
.build();
|
|
||||||
dela.setNextUnits(Stream.of(regExp, number).collect(Collectors.toSet()));
|
|
||||||
|
|
||||||
Set<String> strings = Stream.of("витамин", "мультифрукт", "арбуз", "параметр").collect(Collectors.toSet());
|
|
||||||
|
|
||||||
TestUnit unreal = TestUnit.builder()
|
|
||||||
.keyWords(strings)
|
|
||||||
.message("победа")
|
|
||||||
.matchThreshold(100)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
Set<TestUnit> testUnits = new HashSet<>();
|
|
||||||
testUnits.add(hello);
|
|
||||||
testUnits.add(regExp);
|
|
||||||
testUnits.add(unreal);
|
|
||||||
|
|
||||||
UnitPointerServiceImpl<TestUnit> unitPointerService = new UnitPointerServiceImpl<>(new UnitPointerRepositoryMap<>());
|
|
||||||
autoresponder = new AutoResponder<>(unitPointerService, testUnits);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void simpleAnswer() {
|
|
||||||
String message = autoresponder.answer(1L, "привет это тестирвоание функциональности").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("тест", message);
|
|
||||||
String message1 = autoresponder.answer(2L, "привет, еще одно тестирование").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("тест", message1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void defaultAnswer() {
|
|
||||||
TestUnit defaultUnit = TestUnit.builder().message("не знаю").build();
|
|
||||||
autoresponder.setDefaultUnit(defaultUnit);
|
|
||||||
|
|
||||||
Assert.assertEquals("не знаю", autoresponder.answer(2L, "пока").orElseThrow(NullPointerException::new).getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void notDefaultAnswer() {
|
|
||||||
Assert.assertEquals(Optional.empty(), autoresponder.answer(2L, "пока"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void regExpAnswer() {
|
|
||||||
String message = autoresponder.answer(1L, "79101234567").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("регулярка", message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void priorityAnswer() {
|
|
||||||
autoresponder.answer(1L, "привет");
|
|
||||||
autoresponder.answer(2L, "привет");
|
|
||||||
String message = autoresponder.answer(1L, "как твои делишки").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("отлично", message);
|
|
||||||
String message1 = autoresponder.answer(2L, "твои дела все еще хорошо?").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("хорошо", message1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void showRegExpVsKeyWords() {
|
|
||||||
autoresponder.answer(1L, "привет");
|
|
||||||
autoresponder.answer(1L, "дела");
|
|
||||||
Assert.assertEquals("регулярка", autoresponder.answer(1L, "89101234567").orElseThrow(NullPointerException::new).getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void matchThreshold() {
|
|
||||||
autoresponder.answer(1L, "витамин я сьем, и арбуз получу");
|
|
||||||
String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт";
|
|
||||||
String answer = autoresponder.answer(1L, message).orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("победа", answer);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void generalAnswer() {
|
|
||||||
TestUnit defaultUnit = TestUnit.builder().message("не знаю").build();
|
|
||||||
autoresponder.setDefaultUnit(defaultUnit);
|
|
||||||
String answer = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("тест", answer);
|
|
||||||
Assert.assertEquals("хорошо", autoresponder.answer(1L, "как твои дела").orElseThrow(NullPointerException::new).getMessage());
|
|
||||||
String answer2 = autoresponder.answer(2L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("тест", answer2);
|
|
||||||
Assert.assertEquals("не знаю", autoresponder.answer(1L, "нет").orElseThrow(NullPointerException::new).getMessage());
|
|
||||||
String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт";
|
|
||||||
Assert.assertEquals("победа", autoresponder.answer(3L, message).orElseThrow(NullPointerException::new).getMessage());
|
|
||||||
Assert.assertEquals("регулярка", autoresponder.answer(1L, "8912345678").orElseThrow(NullPointerException::new).getMessage());
|
|
||||||
String answer3 = autoresponder.answer(1L, "привет это тестирование функциональности").orElseThrow(NullPointerException::new).getMessage();
|
|
||||||
Assert.assertEquals("тест", answer3);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
package org.sadtech.autoresponder.test;
|
|
||||||
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.EqualsAndHashCode;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.Singular;
|
|
||||||
import lombok.ToString;
|
|
||||||
import org.sadtech.autoresponder.entity.Unit;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
@EqualsAndHashCode(callSuper = true)
|
|
||||||
@ToString
|
|
||||||
public class TestUnit extends Unit<TestUnit> {
|
|
||||||
|
|
||||||
private String message;
|
|
||||||
|
|
||||||
@Builder
|
|
||||||
public TestUnit(@Singular Set<String> keyWords,
|
|
||||||
String phrase,
|
|
||||||
Pattern pattern,
|
|
||||||
Integer matchThreshold,
|
|
||||||
Integer priority,
|
|
||||||
@Singular Set<TestUnit> nextUnits,
|
|
||||||
String message) {
|
|
||||||
super(keyWords, phrase, pattern, matchThreshold, priority, nextUnits);
|
|
||||||
this.message = message;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user