From d1f44e85eedfb93bf42f90ad50d3371a210cfa0b Mon Sep 17 00:00:00 2001 From: Hai Liang Wang Date: Mon, 26 Dec 2022 11:20:16 +0800 Subject: [PATCH] https://github.com/cskefu/cskefu/issues/751 add sample codes for server and sample plugin Signed-off-by: Hai Liang Wang --- .gitignore | 8 + compose/plugins/.gitignore | 2 + compose/sample.env | 7 + plugins/sample/pom.xml | 101 +++++++++ .../com/cskefu/plugins/sample/Activator.java | 21 ++ .../com/cskefu/plugins/sample/Sample.java | 18 ++ server/README.md | 15 ++ server/bom-plugin/pom.xml | 30 +++ server/mod-plugin/pom.xml | 19 ++ .../mod/plugin/AbstractPluginActivator.java | 27 +++ .../java/com/cskefu/mod/plugin/IPlugin.java | 11 + .../cskefu/mod/plugin/PluginDescriptor.java | 15 ++ .../cskefu/mod/plugin/dto/ActionResponse.java | 10 + .../mod/plugin/dto/NotificationResponse.java | 10 + .../plugin/AbstractPluginActivatorTest.java | 58 +++++ server/pom.xml | 211 ++++++++++++++++++ server/scripts/deploy.sh | 20 ++ server/scripts/dev.sh | 20 ++ server/scripts/package.sh | 20 ++ server/serving-api/Dockerfile | 20 ++ server/serving-api/pom.xml | 65 ++++++ .../cskefu/serving/api/SampleApplication.java | 16 ++ .../serving/api/config/PluginsConfigurer.java | 27 +++ .../api/controllers/SampleController.java | 46 ++++ .../com/cskefu/serving/api/dto/Sample.java | 11 + .../serving/api/service/PluginList.java | 30 +++ .../serving/api/service/PluginService.java | 130 +++++++++++ .../service/SpringAwareBundleListener.java | 67 ++++++ .../src/main/resources/application.properties | 22 ++ .../api/controllers/SampleControllerTest.java | 53 +++++ .../api/service/PluginServiceTests.java | 49 ++++ .../SpringAwareBundleListenerTest.java | 100 +++++++++ server/serving-auth/pom.xml | 135 ----------- .../cskefu/auth/CskefuAuthApplication.java | 11 - .../src/main/resources/application-dev.yml | 29 --- .../src/main/resources/application-pro.yml | 0 .../src/main/resources/application.yml | 35 --- server/serving-biz/pom.xml | 103 --------- .../com/cskefu/biz/CskefuBIZApplication.java | 11 - .../biz/swagger/SwaggerConfiguration.java | 59 ----- .../src/main/resources/application-dev.yml | 29 --- .../src/main/resources/application-pro.yml | 0 .../src/main/resources/application.yml | 28 --- server/serving-common/pom.xml | 68 ------ .../java/com/cskefu/common/BaseEntity.java | 22 -- .../main/java/com/cskefu/common/Result.java | 78 ------- server/serving-conversation/pom.xml | 98 -------- .../io/CskefuConversationApplication.java | 11 - .../io/swagger/SwaggerConfiguration.java | 59 ----- .../src/main/resources/application-dev.yml | 29 --- .../src/main/resources/application-pro.yml | 0 .../src/main/resources/application.yml | 28 --- server/serving-gateway/pom.xml | 60 ----- .../gateway/CskefuGatewayApplication.java | 11 - .../src/main/resources/application-dev.yml | 29 --- .../src/main/resources/application-pro.yml | 0 .../src/main/resources/application.yml | 5 - 57 files changed, 1259 insertions(+), 938 deletions(-) create mode 100644 compose/plugins/.gitignore create mode 100644 compose/sample.env create mode 100644 plugins/sample/pom.xml create mode 100644 plugins/sample/src/main/java/com/cskefu/plugins/sample/Activator.java create mode 100644 plugins/sample/src/main/java/com/cskefu/plugins/sample/Sample.java create mode 100644 server/bom-plugin/pom.xml create mode 100644 server/mod-plugin/pom.xml create mode 100644 server/mod-plugin/src/main/java/com/cskefu/mod/plugin/AbstractPluginActivator.java create mode 100644 server/mod-plugin/src/main/java/com/cskefu/mod/plugin/IPlugin.java create mode 100644 server/mod-plugin/src/main/java/com/cskefu/mod/plugin/PluginDescriptor.java create mode 100644 server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/ActionResponse.java create mode 100644 server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/NotificationResponse.java create mode 100644 server/mod-plugin/src/test/java/com/cskefu/mod/plugin/AbstractPluginActivatorTest.java create mode 100644 server/pom.xml create mode 100644 server/scripts/deploy.sh create mode 100644 server/scripts/dev.sh create mode 100644 server/scripts/package.sh create mode 100644 server/serving-api/Dockerfile create mode 100644 server/serving-api/pom.xml create mode 100644 server/serving-api/src/main/java/com/cskefu/serving/api/SampleApplication.java create mode 100644 server/serving-api/src/main/java/com/cskefu/serving/api/config/PluginsConfigurer.java create mode 100644 server/serving-api/src/main/java/com/cskefu/serving/api/controllers/SampleController.java create mode 100644 server/serving-api/src/main/java/com/cskefu/serving/api/dto/Sample.java create mode 100644 server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginList.java create mode 100644 server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginService.java create mode 100644 server/serving-api/src/main/java/com/cskefu/serving/api/service/SpringAwareBundleListener.java create mode 100644 server/serving-api/src/main/resources/application.properties create mode 100644 server/serving-api/src/test/java/com/cskefu/serving/api/controllers/SampleControllerTest.java create mode 100644 server/serving-api/src/test/java/com/cskefu/serving/api/service/PluginServiceTests.java create mode 100644 server/serving-api/src/test/java/com/cskefu/serving/api/service/SpringAwareBundleListenerTest.java delete mode 100644 server/serving-auth/pom.xml delete mode 100644 server/serving-auth/src/main/java/com/cskefu/auth/CskefuAuthApplication.java delete mode 100644 server/serving-auth/src/main/resources/application-dev.yml delete mode 100644 server/serving-auth/src/main/resources/application-pro.yml delete mode 100644 server/serving-auth/src/main/resources/application.yml delete mode 100644 server/serving-biz/pom.xml delete mode 100644 server/serving-biz/src/main/java/com/cskefu/biz/CskefuBIZApplication.java delete mode 100644 server/serving-biz/src/main/java/com/cskefu/biz/swagger/SwaggerConfiguration.java delete mode 100644 server/serving-biz/src/main/resources/application-dev.yml delete mode 100644 server/serving-biz/src/main/resources/application-pro.yml delete mode 100644 server/serving-biz/src/main/resources/application.yml delete mode 100644 server/serving-common/pom.xml delete mode 100644 server/serving-common/src/main/java/com/cskefu/common/BaseEntity.java delete mode 100644 server/serving-common/src/main/java/com/cskefu/common/Result.java delete mode 100644 server/serving-conversation/pom.xml delete mode 100644 server/serving-conversation/src/main/java/com/cskefu/io/CskefuConversationApplication.java delete mode 100644 server/serving-conversation/src/main/java/com/cskefu/io/swagger/SwaggerConfiguration.java delete mode 100644 server/serving-conversation/src/main/resources/application-dev.yml delete mode 100644 server/serving-conversation/src/main/resources/application-pro.yml delete mode 100644 server/serving-conversation/src/main/resources/application.yml delete mode 100644 server/serving-gateway/pom.xml delete mode 100644 server/serving-gateway/src/main/java/com/cskefu/gateway/CskefuGatewayApplication.java delete mode 100644 server/serving-gateway/src/main/resources/application-dev.yml delete mode 100644 server/serving-gateway/src/main/resources/application-pro.yml delete mode 100644 server/serving-gateway/src/main/resources/application.yml diff --git a/.gitignore b/.gitignore index f3f99e28..9f36f197 100644 --- a/.gitignore +++ b/.gitignore @@ -2,11 +2,13 @@ *.swo *.sublime-* *.pyc + jmeter.log __pycache__ tmp/ node_modules/ sftp-config.json + .DS_Store *.iml *.ipr @@ -20,6 +22,12 @@ backups/ build.gradle .vscode/ nohup.out +logs/ + docker-compose.dev.yml docker-compose.custom.yml +.jqwik-database private + +target/ +dist/ diff --git a/compose/plugins/.gitignore b/compose/plugins/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/compose/plugins/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/compose/sample.env b/compose/sample.env new file mode 100644 index 00000000..ab37c3f1 --- /dev/null +++ b/compose/sample.env @@ -0,0 +1,7 @@ +# https://docs.docker.com/compose/reference/envvars/#compose_file +# use Enterprise edition: docker-compose.yml:./private/docker-compose.ext.yml +# use other customize yml, copy docker-compose.yml as docker-compose.custom.yml +# and edit .env with COMPOSE_FILE=docker-compose.custom.yml, docker-compose.custom.yml +# is ignored with .gitignore +COMPOSE_FILE=docker-compose.yml +COMPOSE_PROJECT_NAME=cskefu_v8 diff --git a/plugins/sample/pom.xml b/plugins/sample/pom.xml new file mode 100644 index 00000000..d302e107 --- /dev/null +++ b/plugins/sample/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + com.cskefu.plugins + sample + 0.0.1-SNAPSHOT + bundle + CSKeFu Plugin Sample + + + 17 + 17 + 17 + 5.1.1 + + + + + com.cskefu + mod-plugin + + + + + + + com.cskefu + bom-plugin + 0.0.1-SNAPSHOT + pom + import + + + + + + ${project.groupId}-${project.artifactId}-${project.version}.${build.time} + + + org.codehaus.mojo + build-helper-maven-plugin + 1.10 + + + timestamp-property + + timestamp-property + + + build.time + yyyyMMddHHmm + zh_CN + Asia/Shanghai + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + + org.apache.felix + maven-bundle-plugin + ${bundle.plugin.version} + true + + + + ${project.artifactId} + + ${project.name} + ${project.version} + com.cskefu.plugins.sample.Activator + com.cskefu.plugins.sample + + !*,org.osgi.framework,com.cskefu.mod.plugin,com.cskefu.mod.plugin.dto + + + + slf4j-api;scope=compile|runtime; type=!pom; inline=false, + logback-*;scope=compile|runtime; type=!pom; inline=false + + com.cskefu.plugins.sample.Sample + true + + ../../compose/plugins + + + + + + diff --git a/plugins/sample/src/main/java/com/cskefu/plugins/sample/Activator.java b/plugins/sample/src/main/java/com/cskefu/plugins/sample/Activator.java new file mode 100644 index 00000000..f2ba96a4 --- /dev/null +++ b/plugins/sample/src/main/java/com/cskefu/plugins/sample/Activator.java @@ -0,0 +1,21 @@ +package com.cskefu.plugins.sample; + +import com.cskefu.mod.plugin.AbstractPluginActivator; +import com.cskefu.mod.plugin.IPlugin; +import com.cskefu.mod.plugin.PluginDescriptor; + +import java.util.Hashtable; + +public class Activator extends AbstractPluginActivator { + + @Override + protected PluginDescriptor registerService() { + Hashtable props = new Hashtable<>(); + props.put("Plugin-Name", "SamplePlugin"); + return PluginDescriptor.builder() + .implementation(new Sample()) + .name(IPlugin.class.getName()) + .params(props) + .build(); + } +} diff --git a/plugins/sample/src/main/java/com/cskefu/plugins/sample/Sample.java b/plugins/sample/src/main/java/com/cskefu/plugins/sample/Sample.java new file mode 100644 index 00000000..275c2121 --- /dev/null +++ b/plugins/sample/src/main/java/com/cskefu/plugins/sample/Sample.java @@ -0,0 +1,18 @@ +package com.cskefu.plugins.sample; + +import com.cskefu.mod.plugin.IPlugin; +import com.cskefu.mod.plugin.dto.ActionResponse; +import com.cskefu.mod.plugin.dto.NotificationResponse; + +public class Sample implements IPlugin { + @Override + public ActionResponse doAction() { + return ActionResponse.builder().body("Action Worked !!").build(); + } + + @Override + public NotificationResponse doNotification() { + return NotificationResponse.builder().body("Notification Processed...").build(); + } + +} diff --git a/server/README.md b/server/README.md index e69de29b..01a6c80b 100644 --- a/server/README.md +++ b/server/README.md @@ -0,0 +1,15 @@ +# Server + +## Scripts + +``` +./scripts/package.sh # package JAR +./scripts/deploy.sh # deploy JAR, POM into Chatopera Nexus Repo +``` + + +## Serving API + +``` +./scripts/dev.sh # run JAR as standalone spring boot application, provide API with 8080 +``` \ No newline at end of file diff --git a/server/bom-plugin/pom.xml b/server/bom-plugin/pom.xml new file mode 100644 index 00000000..d80a1d59 --- /dev/null +++ b/server/bom-plugin/pom.xml @@ -0,0 +1,30 @@ + + + + root + com.cskefu + 0.0.1-SNAPSHOT + + 4.0.0 + CSKeFu Bom Plugin + bom-plugin + pom + Standard Parent POM for CSKeFu Plugins. + + + ${java.version} + ${java.version} + + + + + + mod-plugin + com.cskefu + ${project.parent.version} + + + + diff --git a/server/mod-plugin/pom.xml b/server/mod-plugin/pom.xml new file mode 100644 index 00000000..d7ba90f3 --- /dev/null +++ b/server/mod-plugin/pom.xml @@ -0,0 +1,19 @@ + + + + root + com.cskefu + 0.0.1-SNAPSHOT + + 4.0.0 + CSKeFu Module Plugin + mod-plugin + + + ${java.version} + ${java.version} + + + diff --git a/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/AbstractPluginActivator.java b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/AbstractPluginActivator.java new file mode 100644 index 00000000..696bc452 --- /dev/null +++ b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/AbstractPluginActivator.java @@ -0,0 +1,27 @@ +package com.cskefu.mod.plugin; + +import lombok.extern.slf4j.Slf4j; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +@Slf4j +public abstract class AbstractPluginActivator implements BundleActivator { + + public static BundleContext bundleContext; + + @Override + public final void start(BundleContext context) throws Exception { + bundleContext = context; + PluginDescriptor descriptor = registerService(); + bundleContext.registerService(descriptor.getName(), descriptor.getImplementation(), descriptor.getParams()); + log.info("Service registered: " + descriptor.getImplementation().getClass().getName()); + } + + @Override + public final void stop(BundleContext context) throws Exception { + bundleContext = null; + log.info("Stopping plugin " + this.getClass().getName()); + } + + protected abstract PluginDescriptor registerService(); +} diff --git a/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/IPlugin.java b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/IPlugin.java new file mode 100644 index 00000000..4407f573 --- /dev/null +++ b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/IPlugin.java @@ -0,0 +1,11 @@ +package com.cskefu.mod.plugin; + +import com.cskefu.mod.plugin.dto.ActionResponse; +import com.cskefu.mod.plugin.dto.NotificationResponse; + +public interface IPlugin { + + ActionResponse doAction(); + + NotificationResponse doNotification(); +} diff --git a/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/PluginDescriptor.java b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/PluginDescriptor.java new file mode 100644 index 00000000..0411ef6d --- /dev/null +++ b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/PluginDescriptor.java @@ -0,0 +1,15 @@ +package com.cskefu.mod.plugin; + +import java.util.Hashtable; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class PluginDescriptor { + + Object implementation; + String name; + Hashtable params; + +} diff --git a/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/ActionResponse.java b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/ActionResponse.java new file mode 100644 index 00000000..d6532698 --- /dev/null +++ b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/ActionResponse.java @@ -0,0 +1,10 @@ +package com.cskefu.mod.plugin.dto; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class ActionResponse { + String body; +} diff --git a/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/NotificationResponse.java b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/NotificationResponse.java new file mode 100644 index 00000000..e9ef964f --- /dev/null +++ b/server/mod-plugin/src/main/java/com/cskefu/mod/plugin/dto/NotificationResponse.java @@ -0,0 +1,10 @@ +package com.cskefu.mod.plugin.dto; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class NotificationResponse { + String body; +} diff --git a/server/mod-plugin/src/test/java/com/cskefu/mod/plugin/AbstractPluginActivatorTest.java b/server/mod-plugin/src/test/java/com/cskefu/mod/plugin/AbstractPluginActivatorTest.java new file mode 100644 index 00000000..24845522 --- /dev/null +++ b/server/mod-plugin/src/test/java/com/cskefu/mod/plugin/AbstractPluginActivatorTest.java @@ -0,0 +1,58 @@ +package com.cskefu.mod.plugin; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import com.cskefu.mod.plugin.dto.ActionResponse; +import com.cskefu.mod.plugin.dto.NotificationResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.osgi.framework.BundleContext; + +@ExtendWith(MockitoExtension.class) +class AbstractPluginActivatorTest { + + private AbstractPluginActivator cut; + @Mock + private BundleContext bundleContext; + + + @BeforeEach + void setUp() { + cut = new TestActivator(); + } + + @Test + @DisplayName("When start method invoked, then the plugin service is registered into the bundle context") + void testStart() throws Exception { + cut.start(bundleContext); + verify(bundleContext, times(1)).registerService(eq("com.mornati.sample.commons.plugins.IPlugin"), any(SampleService.class), any()); + } + + public class TestActivator extends AbstractPluginActivator { + + @Override + protected PluginDescriptor registerService() { + return PluginDescriptor.builder().implementation(new SampleService()).name(IPlugin.class.getName()).build(); + } + } + + public class SampleService implements IPlugin { + + @Override + public ActionResponse doAction() { + return ActionResponse.builder().body("sample action").build(); + } + + @Override + public NotificationResponse doNotification() { + return NotificationResponse.builder().body("sample notification").build(); + } + } +} diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 00000000..6a2af02d --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,211 @@ + + + 4.0.0 + pom + + serving-api + mod-plugin + bom-plugin + + + org.springframework.boot + spring-boot-starter-parent + 2.7.7 + + + com.cskefu + root + 0.0.1-SNAPSHOT + CSKeFu Root + OpenSource Contact Center + + + 17 + 8.0.0 + 7.0.5 + 5.1.1 + 0.8.7 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.osgi + osgi.core + ${osgi.version} + + + + + org.apache.felix + org.apache.felix.framework + ${felix.version} + + + + + org.apache.felix + org.apache.felix.main + ${felix.version} + + + + + org.apache.felix + org.apache.felix.fileinstall + 3.6.8 + provided + + + + + org.apache.felix + org.apache.felix.scr + 2.1.24 + provided + + + + + org.osgi + org.osgi.util.promise + 1.1.1 + provided + + + + + org.osgi + org.osgi.util.function + 1.1.0 + provided + + + + + org.osgi + org.osgi.service.cm + 1.5.0 + provided + + + + + org.apache.felix + org.apache.felix.shell + 1.4.3 + + + + + org.apache.felix + org.apache.felix.shell.remote + 1.2.0 + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.maven.plugin.version} + test + + + + net.jqwik + jqwik + 1.6.2 + test + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.maven.plugin.version} + + + + prepare-agent + + + + + report + test + + report + + + + + + + + + + chatopera + Chatopera Inc. + https://nexus.chatopera.com/repository/maven-public + + true + + + true + + + + + + + chatopera-releases + Chatopera Nexus Releases + https://nexus.chatopera.com/repository/maven-releases/ + + + chatopera-snapshots + Chatopera Nexus Snapshots + https://nexus.chatopera.com/repository/maven-snapshots/ + + + + + + hailiang-wang + Hai Liang Wang + h@cskefu.com + https://github.com/hailiang-wang + Chatopera Inc. + https://www.chatopera.com + + chief engineer + developer + + Asia/Shanghai + + + + diff --git a/server/scripts/deploy.sh b/server/scripts/deploy.sh new file mode 100644 index 00000000..a23aabd0 --- /dev/null +++ b/server/scripts/deploy.sh @@ -0,0 +1,20 @@ +#! /bin/bash +########################################### +# +########################################### + +# constants +baseDir=$(cd `dirname "$0"`;pwd) +cwdDir=$PWD +export PYTHONUNBUFFERED=1 +export PATH=/opt/miniconda3/envs/venv-py3/bin:$PATH +export TS=$(date +%Y%m%d%H%M%S) +export DATE=`date "+%Y%m%d"` +export DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too + +# functions + +# main +[ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return +cd $baseDir/.. +mvn -DskipTests clean package deploy diff --git a/server/scripts/dev.sh b/server/scripts/dev.sh new file mode 100644 index 00000000..1b825b6d --- /dev/null +++ b/server/scripts/dev.sh @@ -0,0 +1,20 @@ +#! /bin/bash +########################################### +# +########################################### + +# constants +baseDir=$(cd `dirname "$0"`;pwd) +cwdDir=$PWD +export PYTHONUNBUFFERED=1 +export PATH=/opt/miniconda3/envs/venv-py3/bin:$PATH +export TS=$(date +%Y%m%d%H%M%S) +export DATE=`date "+%Y%m%d"` +export DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too + +# functions + +# main +[ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return +cd $baseDir/.. +java -jar serving-api/target/serving-api-0.0.1-SNAPSHOT.jar diff --git a/server/scripts/package.sh b/server/scripts/package.sh new file mode 100644 index 00000000..43043822 --- /dev/null +++ b/server/scripts/package.sh @@ -0,0 +1,20 @@ +#! /bin/bash +########################################### +# +########################################### + +# constants +baseDir=$(cd `dirname "$0"`;pwd) +cwdDir=$PWD +export PYTHONUNBUFFERED=1 +export PATH=/opt/miniconda3/envs/venv-py3/bin:$PATH +export TS=$(date +%Y%m%d%H%M%S) +export DATE=`date "+%Y%m%d"` +export DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too + +# functions + +# main +[ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return +cd $baseDir/.. +mvn -DskipTests clean package diff --git a/server/serving-api/Dockerfile b/server/serving-api/Dockerfile new file mode 100644 index 00000000..d74ea5a1 --- /dev/null +++ b/server/serving-api/Dockerfile @@ -0,0 +1,20 @@ +FROM adoptopenjdk/openjdk15:jdk-15.0.1_9-alpine-slim as build +WORKDIR /workspace/app +COPY target/core*.jar /workspace/app +RUN mkdir -p /workspace/app/dependency && (cd /workspace/app/dependency; jar -xf ../*.jar) + + +FROM adoptopenjdk/openjdk15:jdk-15.0.1_9-alpine-slim +VOLUME /tmp + +ARG DEPENDENCY=/workspace/app/dependency +RUN addgroup --system app_group && adduser --system app_user --ingroup app_group --home /app +COPY --from=build --chown=app_user ${DEPENDENCY}/BOOT-INF/lib /app/lib +COPY --from=build --chown=app_user ${DEPENDENCY}/META-INF /app/META-INF +COPY --chown=app_user target/internal-bundles /app/internal-bundles +COPY --from=build --chown=app_user ${DEPENDENCY}/BOOT-INF/classes /app + +USER app_user:app_group +WORKDIR /app + +ENTRYPOINT ["java","-cp","./:lib/*","com.cskefu.serving.api.SampleApplication"] diff --git a/server/serving-api/pom.xml b/server/serving-api/pom.xml new file mode 100644 index 00000000..c5ec67ea --- /dev/null +++ b/server/serving-api/pom.xml @@ -0,0 +1,65 @@ + + + + root + com.cskefu + 0.0.1-SNAPSHOT + + 4.0.0 + CSKeFu Serving API + serving-api + + + ${java.version} + ${java.version} + + + + + com.cskefu + mod-plugin + ${project.parent.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.1.2 + + + copy-dependencies + package + + copy-dependencies + + + org.apache.felix.fileinstall,org.apache.felix.shell,org.apache.felix.shell.remote,org.osgi.util.function,org.osgi.util.promise,org.apache.felix.scr,org.osgi.service.cm + ${project.build.directory}/internal-bundles + false + true + true + + + + + + + + \ No newline at end of file diff --git a/server/serving-api/src/main/java/com/cskefu/serving/api/SampleApplication.java b/server/serving-api/src/main/java/com/cskefu/serving/api/SampleApplication.java new file mode 100644 index 00000000..70b2ae3e --- /dev/null +++ b/server/serving-api/src/main/java/com/cskefu/serving/api/SampleApplication.java @@ -0,0 +1,16 @@ +package com.cskefu.serving.api; + +import com.cskefu.serving.api.config.PluginsConfigurer; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; + +@SpringBootApplication +@EnableConfigurationProperties(PluginsConfigurer.class) +public class SampleApplication { + + public static void main(String[] args) { + SpringApplication.run(SampleApplication.class, args); + } + +} diff --git a/server/serving-api/src/main/java/com/cskefu/serving/api/config/PluginsConfigurer.java b/server/serving-api/src/main/java/com/cskefu/serving/api/config/PluginsConfigurer.java new file mode 100644 index 00000000..f876d5a4 --- /dev/null +++ b/server/serving-api/src/main/java/com/cskefu/serving/api/config/PluginsConfigurer.java @@ -0,0 +1,27 @@ +package com.cskefu.serving.api.config; + +import java.util.Map; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; + +@Configuration +@ConfigurationProperties(prefix = "plugins") +@Getter +@Setter +public class PluginsConfigurer { + + private Map config; + +// @PostConstruct +// public void print() { +// for (Map.Entry entry : config.entrySet()) { +// System.out.println(entry.getKey() + ":" + entry.getValue()); +// } +// } + +} diff --git a/server/serving-api/src/main/java/com/cskefu/serving/api/controllers/SampleController.java b/server/serving-api/src/main/java/com/cskefu/serving/api/controllers/SampleController.java new file mode 100644 index 00000000..4d929325 --- /dev/null +++ b/server/serving-api/src/main/java/com/cskefu/serving/api/controllers/SampleController.java @@ -0,0 +1,46 @@ +package com.cskefu.serving.api.controllers; + +import com.cskefu.mod.plugin.dto.ActionResponse; +import com.cskefu.mod.plugin.dto.NotificationResponse; +import com.cskefu.serving.api.service.PluginList; + +import java.util.Set; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/plugins") +@RequiredArgsConstructor +public class SampleController { + + private final PluginList pluginList; + + @GetMapping + @ResponseBody + public ResponseEntity> getSamples() { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) + .body(pluginList.registered()); + + } + + @GetMapping(value = "/{name}") + @ResponseBody + public ResponseEntity doAction(@PathVariable(value = "name") String name) { + return pluginList.lookup(name).map(pluginImpl -> ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) + .body(pluginImpl.doAction())).orElseGet(() -> ResponseEntity.badRequest().body(ActionResponse.builder().body("Plugin not found for " + name).build())); + } + + @GetMapping(value = "/{name}/notification") + @ResponseBody + public ResponseEntity doNotify(@PathVariable(value = "name") String name) { + return pluginList.lookup(name).map(pluginImpl -> ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON) + .body(pluginImpl.doNotification())).orElseGet(() -> ResponseEntity.badRequest().body(NotificationResponse.builder().body("Plugin not found for " + name).build())); + } + +} diff --git a/server/serving-api/src/main/java/com/cskefu/serving/api/dto/Sample.java b/server/serving-api/src/main/java/com/cskefu/serving/api/dto/Sample.java new file mode 100644 index 00000000..949a9521 --- /dev/null +++ b/server/serving-api/src/main/java/com/cskefu/serving/api/dto/Sample.java @@ -0,0 +1,11 @@ +package com.cskefu.serving.api.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Sample { + String name; + Long id; +} diff --git a/server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginList.java b/server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginList.java new file mode 100644 index 00000000..a9f1262c --- /dev/null +++ b/server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginList.java @@ -0,0 +1,30 @@ +package com.cskefu.serving.api.service; + +import com.cskefu.mod.plugin.IPlugin; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import org.springframework.stereotype.Component; + +@Component +public class PluginList { + private Map plugins = new HashMap<>(); + + public Set registered() { + return plugins.keySet(); + } + + public Optional lookup(String name) { + return Optional.ofNullable(plugins.get(name)); + } + + public void register(String name, IPlugin service) { + plugins.put(name, service); + } + + public void unregister(String name) { + plugins.remove(name); + } + +} diff --git a/server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginService.java b/server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginService.java new file mode 100644 index 00000000..bc1a777b --- /dev/null +++ b/server/serving-api/src/main/java/com/cskefu/serving/api/service/PluginService.java @@ -0,0 +1,130 @@ +package com.cskefu.serving.api.service; + +import com.cskefu.serving.api.config.PluginsConfigurer; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import javax.annotation.PreDestroy; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.felix.main.AutoProcessor; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleException; +import org.osgi.framework.launch.Framework; +import org.osgi.framework.launch.FrameworkFactory; +import org.osgi.framework.wiring.BundleRevision; +import org.osgi.resource.Capability; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.core.type.classreading.CachingMetadataReaderFactory; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.ClassUtils; +import org.springframework.util.SystemPropertyUtils; + +@Service +@RequiredArgsConstructor +@Slf4j +public class PluginService { + + @Getter + private Framework framework; + private final SpringAwareBundleListener springAwareBundleListener; + private final PluginsConfigurer pluginsConfigurer; + + @EventListener(ApplicationReadyEvent.class) + public void startFramework() throws BundleException { + log.info("Starting Plugin OSGi service..."); + // Get Felix properties from Spring Boot config + + try { + // Create an instance and initialise the framework. + FrameworkFactory factory = new org.apache.felix.framework.FrameworkFactory(); + Map felixProperties = new HashMap<>(pluginsConfigurer.getConfig()); + felixProperties.put("org.osgi.framework.system.packages.extra", + findPackageNamesStartingWith( + Optional.ofNullable(felixProperties.get("auto.exported.packages")) + .map(s -> s.split(",")) + .map(Arrays::asList) + .orElse(List.of()) + ) + "," + felixProperties.get("org.osgi.framework.system.packages.extra")); + framework = factory.newFramework(felixProperties); + framework.init(); + + // Use the system bundle context to process the auto-deploy + // and auto-install/auto-start properties. + AutoProcessor.process(pluginsConfigurer.getConfig(), framework.getBundleContext()); + + // Log Bundle Activations + framework.getBundleContext().addBundleListener(springAwareBundleListener); + + // Start the framework. + framework.start(); + + Bundle b = framework.getBundleContext().getBundle(0); + BundleRevision br = b.adapt(BundleRevision.class); + List caps = br.getCapabilities("osgi.ee"); + log.debug("OSGi capabilities: " + caps); + } catch (Exception ex) { + log.error("Error initializing the OSGi framework. As it is mandatory the system will be halted", ex); + System.exit(1); + } + } + + @PreDestroy + public void destroy() throws BundleException, InterruptedException { + log.info("Stopping plugins OSGi service..."); + framework.stop(); + framework.waitForStop(0); + } + + /** + * Felix provides an isolated classloader to each bundle. Bundles need to declare what packages they need in there manifest. + * If a Bundle needs e.g. something from org.slf4j it either needs to have it as classes itself or another bundle must + * export this packages. java.* packages will be provided by the framework from the classloader it was created with. + * We can modify this, by giving the framework a list of additional packages, that are provided by the spring boot + * container (should include e.g.slf4j) + */ + protected String findPackageNamesStartingWith(List packages) { + return packages.stream().map(this::getPackages) + .flatMap(Set::stream) + .collect(Collectors.joining(",")); + } + + protected Set getPackages(String basePackage) { + try { + ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); + MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); + String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + resolveBasePackage(basePackage) + File.separator + "**/*.class"; + return Arrays.stream(resourcePatternResolver.getResources(packageSearchPath)).map(resource -> { + try { + MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); + Class aClass = Class.forName(metadataReader.getClassMetadata().getClassName()); + return aClass.getPackage().getName(); + } catch (ClassNotFoundException | IOException e) { + log.error("Error looking for provided package", e); + return null; + } + }).collect(Collectors.toSet()); + } catch (IOException e) { + log.error("Error looking for provided resource", e); + return Set.of(); + } + } + + private String resolveBasePackage(String basePackage) { + return ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage)); + } + +} diff --git a/server/serving-api/src/main/java/com/cskefu/serving/api/service/SpringAwareBundleListener.java b/server/serving-api/src/main/java/com/cskefu/serving/api/service/SpringAwareBundleListener.java new file mode 100644 index 00000000..cd3ce4d0 --- /dev/null +++ b/server/serving-api/src/main/java/com/cskefu/serving/api/service/SpringAwareBundleListener.java @@ -0,0 +1,67 @@ +package com.cskefu.serving.api.service; + +import com.cskefu.mod.plugin.IPlugin; + +import java.util.Arrays; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleEvent; +import org.osgi.framework.BundleListener; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class SpringAwareBundleListener implements BundleListener { + + private final PluginList pluginList; + + @Override + public void bundleChanged(BundleEvent bundleEvent) { + + log.info( + String.format( + "Bundle %s:%s changed state to %s - Type: %s", + bundleEvent.getBundle().getSymbolicName(), + bundleEvent.getBundle().getVersion(), + getBundleStateAsString(bundleEvent.getBundle().getState()), + getBundleStateAsString(bundleEvent.getType()) + ) + ); + + if (bundleEvent.getBundle().getState() == Bundle.ACTIVE) { + try { + Bundle bundle = bundleEvent.getBundle(); + BundleContext bundleContext = bundle.getBundleContext(); + ServiceReference[] services = bundleContext.getAllServiceReferences(IPlugin.class.getName(), null); + if (services != null && services.length > 0) + Arrays.asList(services) + .forEach(s -> pluginList.register(s.getBundle().getSymbolicName(), (IPlugin) bundleContext.getService(s))); + + } catch (InvalidSyntaxException e) { + log.warn("Problem reading services from BundleContext"); + } + + } else if (bundleEvent.getBundle().getState() == Bundle.UNINSTALLED) { + pluginList.unregister(bundleEvent.getBundle().getSymbolicName()); + } + + } + + private String getBundleStateAsString(int state) { + return switch (state) { + case Bundle.ACTIVE -> "Active"; + case Bundle.INSTALLED -> "Installed"; + case Bundle.RESOLVED -> "Resolved"; + case Bundle.STARTING -> "Starting"; + case Bundle.STOPPING -> "Stopping"; + case Bundle.UNINSTALLED -> "Uninstalled"; + default -> "Unknown"; + }; + + } +} diff --git a/server/serving-api/src/main/resources/application.properties b/server/serving-api/src/main/resources/application.properties new file mode 100644 index 00000000..e93ef522 --- /dev/null +++ b/server/serving-api/src/main/resources/application.properties @@ -0,0 +1,22 @@ +# -------------------------------- +# Felix Framework settings +# https://felix.apache.org/documentation/subprojects/apache-felix-framework/apache-felix-framework-configuration-properties.html +# -------------------------------- +# If true will configure a shutdown hook to shutdown the framework on JVM shutdown +plugins.config.felix.shutdown.hook=true +# Where is the felix bundle cache dir +plugins.config.org.osgi.framework.storage=./serving-api/target/felix-cache +# When to clean the felix-cache directory +plugins.config.org.osgi.framework.storage.clean=onFirstInit +# Directory to look for bundles to deploy once when framework first loads +plugins.config.felix.auto.deploy.dir=./serving-api/target/internal-bundles +# Actions to perform on discovered bundles +plugins.config.felix.auto.deploy.action=install,start,update,uninstall +plugins.config.felix.startlevel.bundle=1 +plugins.config.felix.fileinstall.dir=../compose/plugins +plugins.config.felix.fileinstall.log.level=2 +plugins.config.felix.fileinstall.bundles.updateWithListeners=true +plugins.config.org.osgi.framework.system.packages.extra=org.osgi.framework,org.xml.sax,org.xml.sax.helpers,javax.xml.parsers,javax.naming +plugins.config.auto.exported.packages=com.cskefu.mod.plugin,org.slf4j + +server.servlet.context-path=/api diff --git a/server/serving-api/src/test/java/com/cskefu/serving/api/controllers/SampleControllerTest.java b/server/serving-api/src/test/java/com/cskefu/serving/api/controllers/SampleControllerTest.java new file mode 100644 index 00000000..9c343771 --- /dev/null +++ b/server/serving-api/src/test/java/com/cskefu/serving/api/controllers/SampleControllerTest.java @@ -0,0 +1,53 @@ +package com.cskefu.serving.api.controllers; + + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +@SpringBootTest +@AutoConfigureMockMvc +class SampleControllerTest { + + @Autowired + private SampleController cut; + @Autowired + private MockMvc mockMvc; + + @Test + @DisplayName("When the SpringBoot application is initialized, then the controller is created") + void testControllerInit() { + assertNotNull(cut); + } + + @Test + @DisplayName("When samples list api is called, then the list of installed bundles is returned") + void samplesList() throws Exception { + mockMvc.perform(get("/v1/samples")).andDo(print()).andExpect(status().isOk()) + .andExpect(content().string(containsString("[]"))); + } + + @Test + @DisplayName("When missing sample bundle is called, then the httpStatus is 400 with a message explaining the problem") + void missingPluginCall() throws Exception { + mockMvc.perform(get("/v1/samples/missing-bundle")).andDo(print()).andExpect(status().isBadRequest()) + .andExpect(content().string(containsString("Plugin not found for missing-bundle"))); + } + + @Test + @DisplayName("When missing sample bundle notification is called, then the httpStatus is 400 with a message explaining the problem") + void missingPluginNotificationCall() throws Exception { + mockMvc.perform(get("/v1/samples/missing-bundle/notification")).andDo(print()).andExpect(status().isBadRequest()) + .andExpect(content().string(containsString("Plugin not found for missing-bundle"))); + } +} diff --git a/server/serving-api/src/test/java/com/cskefu/serving/api/service/PluginServiceTests.java b/server/serving-api/src/test/java/com/cskefu/serving/api/service/PluginServiceTests.java new file mode 100644 index 00000000..1038d068 --- /dev/null +++ b/server/serving-api/src/test/java/com/cskefu/serving/api/service/PluginServiceTests.java @@ -0,0 +1,49 @@ +package com.cskefu.serving.api.service; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.cskefu.serving.api.config.PluginsConfigurer; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +@ExtendWith(MockitoExtension.class) +@SpringBootTest(classes = PluginService.class) +class PluginServiceTests { + + @MockBean + private SpringAwareBundleListener springAwareBundleListener; + @MockBean + private PluginsConfigurer pluginsConfigurer; + @Autowired + private PluginService cut; + + @Test + @DisplayName( + "when BundleService is initialized, then the Felix framework is created using the Spring ApplicationReadyEvent") + void testFelixFrameworkCreation() { + assertAll( + () -> assertNotNull(cut), + () -> assertNotNull(cut.getFramework()) + ); + } + + @Test + @DisplayName("When find package is called with a specific package, then subpackages are provided too") + void testExtraPackageConfiguration() { + String result = cut.findPackageNamesStartingWith(List.of("com.mornati.sample")); + assertAll( + () -> assertNotNull(result), + () -> assertTrue(result.contains("com.mornati.sample.service")), + () -> assertTrue(result.contains("com.mornati.sample.commons.plugins.dto")) + ); + } +} diff --git a/server/serving-api/src/test/java/com/cskefu/serving/api/service/SpringAwareBundleListenerTest.java b/server/serving-api/src/test/java/com/cskefu/serving/api/service/SpringAwareBundleListenerTest.java new file mode 100644 index 00000000..719b04ff --- /dev/null +++ b/server/serving-api/src/test/java/com/cskefu/serving/api/service/SpringAwareBundleListenerTest.java @@ -0,0 +1,100 @@ +package com.cskefu.serving.api.service; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.cskefu.mod.plugin.IPlugin; +import com.cskefu.mod.plugin.dto.ActionResponse; +import com.cskefu.mod.plugin.dto.NotificationResponse; + +import java.util.List; +import net.jqwik.api.ForAll; +import net.jqwik.api.Property; +import net.jqwik.api.lifecycle.BeforeProperty; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleEvent; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; + +@ExtendWith(MockitoExtension.class) +class SpringAwareBundleListenerTest { + + private SpringAwareBundleListener cut; + private final PluginList pluginList = Mockito.mock(PluginList.class); + private final BundleEvent bundleEvent = Mockito.mock(BundleEvent.class); + private final Bundle bundle = Mockito.mock(Bundle.class); + private final BundleContext bundleContext = Mockito.mock(BundleContext.class); + private final ServiceReference serviceReference = Mockito.mock(ServiceReference.class); + + + @BeforeProperty + void setUp() { + cut = new SpringAwareBundleListener(pluginList); + } + + @Property + void testActivateBundleEventInvalidPlugin(@ForAll String bundleName) { + when(bundleEvent.getBundle()).thenReturn(bundle); + when(bundle.getBundleContext()).thenReturn(bundleContext); + when(bundle.getState()).thenReturn(Bundle.ACTIVE); + when(bundle.getSymbolicName()).thenReturn(bundleName); + cut.bundleChanged(bundleEvent); + verify(pluginList, never()).register(anyString(), any()); + } + + @Property + void testActivateBundleEventRegisterService(@ForAll String bundleName) throws InvalidSyntaxException { + MockPlugin plugin = new MockPlugin(); + when(bundleEvent.getBundle()).thenReturn(bundle); + when(bundle.getBundleContext()).thenReturn(bundleContext); + when(bundle.getState()).thenReturn(Bundle.ACTIVE); + when(bundle.getSymbolicName()).thenReturn(bundleName); + when(bundleContext.getAllServiceReferences(IPlugin.class.getName(), null)).thenReturn(List.of(serviceReference).toArray(new ServiceReference[0])); + when(bundleContext.getService(serviceReference)).thenReturn(plugin); + when(serviceReference.getBundle()).thenReturn(bundle); + + cut.bundleChanged(bundleEvent); + + verify(pluginList).register(bundleName, plugin); + } + + @Property + void testUnregisterService(@ForAll String bundleName) throws InvalidSyntaxException { + MockPlugin plugin = new MockPlugin(); + when(bundleEvent.getBundle()).thenReturn(bundle); + when(bundle.getBundleContext()).thenReturn(bundleContext); + when(bundle.getState()).thenReturn(Bundle.ACTIVE); + when(bundle.getSymbolicName()).thenReturn(bundleName); + when(bundleContext.getAllServiceReferences(IPlugin.class.getName(), null)).thenReturn(List.of(serviceReference).toArray(new ServiceReference[0])); + when(bundleContext.getService(serviceReference)).thenReturn(plugin); + when(serviceReference.getBundle()).thenReturn(bundle); + + cut.bundleChanged(bundleEvent); + when(bundle.getState()).thenReturn(Bundle.UNINSTALLED); + cut.bundleChanged(bundleEvent); + verify(pluginList, atLeast(1)).unregister(bundleName); + } + + class MockPlugin implements IPlugin { + + @Override + public ActionResponse doAction() { + return null; + } + + @Override + public NotificationResponse doNotification() { + return null; + } + } + + +} diff --git a/server/serving-auth/pom.xml b/server/serving-auth/pom.xml deleted file mode 100644 index 8a3b922b..00000000 --- a/server/serving-auth/pom.xml +++ /dev/null @@ -1,135 +0,0 @@ - - - com.cskefu - cskefu-auth - 0.0.1-SNAPSHOT - 4.0.0 - cskefu-auth - https://www.cskefu.com/ - - UTF-8 - 11 - 11 - 11 - 2.7.4 - 2021.0.4 - 2.2.2 - 1.18.6 - 8.0.30 - 3.17.7 - 3.0.0 - 0.11.5 - 0.0.9 - - - - com.cskefu - cskefu-common - 0.0.1-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-security - - - - - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - com.github.axet - kaptcha - ${kaptcha.version} - - - io.jsonwebtoken - jjwt-api - ${jsonwebtoken.version} - - - io.jsonwebtoken - jjwt-impl - ${jsonwebtoken.version} - - - io.jsonwebtoken - jjwt-jackson - ${jsonwebtoken.version} - - - - - - - - - - - - - - - - - - - io.springfox - springfox-swagger2 - ${swagger.version} - - - io.springfox - springfox-swagger-ui - ${swagger.version} - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud.version}.0 - pom - import - - - - diff --git a/server/serving-auth/src/main/java/com/cskefu/auth/CskefuAuthApplication.java b/server/serving-auth/src/main/java/com/cskefu/auth/CskefuAuthApplication.java deleted file mode 100644 index e8fd07dc..00000000 --- a/server/serving-auth/src/main/java/com/cskefu/auth/CskefuAuthApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cskefu.auth; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CskefuAuthApplication { - public static void main(String[] args) { - SpringApplication.run(CskefuAuthApplication.class, args); - } -} \ No newline at end of file diff --git a/server/serving-auth/src/main/resources/application-dev.yml b/server/serving-auth/src/main/resources/application-dev.yml deleted file mode 100644 index cc21aa76..00000000 --- a/server/serving-auth/src/main/resources/application-dev.yml +++ /dev/null @@ -1,29 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8 - username: root - password: 123456 - - cloud: - # sentinel配置 - sentinel: - eager: true - transport: - dashboard: - 127.0.0.1:8848 - port: 8719 - heartbeat-interval-ms: 5000 - nacos: - # 注册中心配置 - discovery: - server-addr: localhost:8848 - namespace: xxxxxxx -# # 配置中心 -# config: -# server-addr: 127.0.0.1:8848 -# file-extension: yaml -# namespace: jm-live-dev -# shared-configs[0]: -# group: sentinel -# data-id: sentinel-shared.yaml -# refresh: true diff --git a/server/serving-auth/src/main/resources/application-pro.yml b/server/serving-auth/src/main/resources/application-pro.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/server/serving-auth/src/main/resources/application.yml b/server/serving-auth/src/main/resources/application.yml deleted file mode 100644 index b3a925ac..00000000 --- a/server/serving-auth/src/main/resources/application.yml +++ /dev/null @@ -1,35 +0,0 @@ -server: - port: 8000 -spring: - application: - name: cskefu-auth - profiles: - active: dev - datasource: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - hikari: - connection-timeout: 5000 - minimum-idle: 5 - maximum-pool-size: 20 - auto-commit: false - idle-timeout: 600000 - pool-name: DataSourceHikariCP - max-lifetime: 1800000 - connection-test-query: select 1 - redis: - host: 127.0.0.1 - port: 6379 - timeout: 5000 - database: 0 - lettuce: - pool: - max-active: 8 - max-idle: 8 - min-idle: 0 - max-wait: -1ms - -cskefu: - cskefu: - private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8TSxdMp76dZS2L8DpvJOgHNJmeI8PM30CFSeVMCHV5dEjtixipsMsSQu0ariAtVfA5M/ma1wcqEpsDO9nVQRsmsJCKMIWOcR6yBQU9f0T7Hkmil4Ckf61C1R7wLrynOjCeUCneQ7R0+dg9K25CymclPnK4ym2GInmuUjdbyQQcX4QBuIbmuY10MG8nW9ovhFML85KoBk5yxV4zVwLGP4TFJVnBmiNO3XSKL2XsX7wFFO93O8jmAnzgpWj8khsZAYG4nijIz2BciS9uQFa/lUX6yD50ykjNklbhCBIMGaQ6rr1WjnwLHDZU9sLvcYMboKPJHWz1FttvxuKSLYbf7j/AgMBAAECggEAEH1rPSrwF47kdW/vibu+uDuat7Tz3w9RpM6lc/Mn6ctoA6PLqN5hvFpJPbhHoAqn1kSZ0EJNA4imIjNsluf8rMyAs1QbN+CnMpMC7zL7jrS1IO+ze+LwVnpyufbbm3nfCE85OKSC7IbAfhHvUYOHIvQI5Zn76FTamFHxh5klpCrY1h8gcVWdRxiK0Q8AQP7KD0QnkzgROhkRmdI01639VyTCTc6Rtv5puU6J6idJwTd3JAiJXZ2qcoAwhnkSHnVnP5ktFxl66eHGJKeol6bGcJIFQRGLVmh78x6MXoqkJ2M7DRntL38TLKT5KCYViGxUpO0gED/HQBhDALyNevJZQQKBgQDr+pZDtRIQ6mMZMswKTo2+zIFEUFES2sR/bunEW5snPR3krKdgzJoEg7WERkMviSlvW6K7a6VeJ9KKO/iE07lcRkN2NQZUkBDsrNRgoOwB17hHJqrMyZ1It+hZmPQTkeyJu/BCxDkIMwbQYXxIe8J/dVYjHJVXZgzPqEXKYqeViwKBgQDMRwr7ceW+9c/GzHd7p6849s3+MbT0kzyXDTdeJkQFSDPufYapTCan/MrdJmnIRz8pq2URZrO4kDDxxeWu2Vkekv9cxVFrQVFfvuq+4BFpQvYkRHk9PDzCmgFJD/wLG8gzNTH7UahaNb7m0tPB3D1g5Q6LzZCc1h3s2K6SLS7g3QKBgE41Bof6ArrIc39ubmEcF64caNsTI0t0ZZs2TxNcqNcgUj/vWKmkJYdJf2cPQkUG2Eynug8TZgMGf6iAp6Sd5tjGEKWkfSyZcoJ95QUBUDZsIA60qfak+xOWn9LR9lJmElazirUWAzDMeH2nUWFUYumLIbkRSA1nLOfFhRvGBnRxAoGBAJvDAAjCzGBTpt77QZA0SFOzPVc6J7TmICk9lp5fpzYv3AlaBbhJrKAjDbybccWZLfxkCGjAWwG8UNXKBFzStjWt+LGQc4jJAXd0aCKrUBtnR7BX1epvaBUqwRgo7BK8WGdThI0RssE2gh4XXAhSGysq/XB0inRMf/z9K/+iHECxAoGAFlcIZ4/xXhbObUPU05hZFoj+zN5obaOLefRJn4uqjD9/VSRnI2bBv7vXKoLX6BwFF/PWvg1hzGy3O9TQ4XYPOqNGcBFDOqwxmVVevzXgRInoiRNP3xZXcqswppEbqORGbRoPLQBqLnPx1GKwbo7Fp9O5ywARVZtf4STt3pRK8PY= - public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvE0sXTKe+nWUti/A6byToBzSZniPDzN9AhUnlTAh1eXRI7YsYqbDLEkLtGq4gLVXwOTP5mtcHKhKbAzvZ1UEbJrCQijCFjnEesgUFPX9E+x5JopeApH+tQtUe8C68pzownlAp3kO0dPnYPStuQspnJT5yuMpthiJ5rlI3W8kEHF+EAbiG5rmNdDBvJ1vaL4RTC/OSqAZOcsVeM1cCxj+ExSVZwZojTt10ii9l7F+8BRTvdzvI5gJ84KVo/JIbGQGBuJ4oyM9gXIkvbkBWv5VF+sg+dMpIzZJW4QgSDBmkOq69Vo58Cxw2VPbC73GDG6CjyR1s9Rbbb8biki2G3+4/wIDAQAB diff --git a/server/serving-biz/pom.xml b/server/serving-biz/pom.xml deleted file mode 100644 index b6a168d2..00000000 --- a/server/serving-biz/pom.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - com.cskefu - cskefu-biz - 0.0.1-SNAPSHOT - 4.0.0 - cskefu-biz - https://www.cskefu.com/ - - UTF-8 - 11 - 11 - 11 - 2.7.4 - 2021.0.4 - 2.2.2 - 1.18.6 - 8.0.30 - 3.17.7 - 3.0.0 - - - - com.cskefu - cskefu-common - 0.0.1-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-data-redis - - - org.springframework.boot - spring-boot-starter-validation - - - org.projectlombok - lombok - ${lombok.version} - - - org.redisson - redisson-spring-boot-starter - ${redisson-spring.version} - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring.version} - - - mysql - mysql-connector-java - ${mysql-connector.version} - runtime - - - io.springfox - springfox-swagger2 - ${swagger.version} - - - io.springfox - springfox-swagger-ui - ${swagger.version} - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud.version}.0 - pom - import - - - - diff --git a/server/serving-biz/src/main/java/com/cskefu/biz/CskefuBIZApplication.java b/server/serving-biz/src/main/java/com/cskefu/biz/CskefuBIZApplication.java deleted file mode 100644 index cbc11eb6..00000000 --- a/server/serving-biz/src/main/java/com/cskefu/biz/CskefuBIZApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cskefu.biz; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CskefuBIZApplication { - public static void main(String[] args) { - SpringApplication.run(CskefuBIZApplication.class, args); - } -} \ No newline at end of file diff --git a/server/serving-biz/src/main/java/com/cskefu/biz/swagger/SwaggerConfiguration.java b/server/serving-biz/src/main/java/com/cskefu/biz/swagger/SwaggerConfiguration.java deleted file mode 100644 index 63fa3bd8..00000000 --- a/server/serving-biz/src/main/java/com/cskefu/biz/swagger/SwaggerConfiguration.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.cskefu.biz.swagger; - -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.*; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -@Configuration -@EnableSwagger2 -public class SwaggerConfiguration { - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.OAS_30) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) - .paths(PathSelectors.regex("(?!/error.*).*")) - .build() - .securityContexts(Arrays.asList(securityContext())) - .securitySchemes(Arrays.asList(new ApiKey("token", "token", SecuritySchemeIn.HEADER.name()))); - } - - private SecurityContext securityContext() { - return SecurityContext.builder() - .securityReferences(defaultAuth()) - //.forPaths(PathSelectors.regex("/*.*")) - .build(); - } - - private List defaultAuth() { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - return Collections.singletonList(new SecurityReference("token", authorizationScopes)); - } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("cskefu Swagger API") - .description("春松客服Swagger API") - .contact(new Contact("cskefu", "https://www.cskefu.com/", "dev@lists.cskefu.com")) - .license("Apache License Version 2.0") - .licenseUrl("http://www.apache.org/licenese/LICENSE-2.0") - .version("1.0") - .build(); - } -} \ No newline at end of file diff --git a/server/serving-biz/src/main/resources/application-dev.yml b/server/serving-biz/src/main/resources/application-dev.yml deleted file mode 100644 index cc21aa76..00000000 --- a/server/serving-biz/src/main/resources/application-dev.yml +++ /dev/null @@ -1,29 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8 - username: root - password: 123456 - - cloud: - # sentinel配置 - sentinel: - eager: true - transport: - dashboard: - 127.0.0.1:8848 - port: 8719 - heartbeat-interval-ms: 5000 - nacos: - # 注册中心配置 - discovery: - server-addr: localhost:8848 - namespace: xxxxxxx -# # 配置中心 -# config: -# server-addr: 127.0.0.1:8848 -# file-extension: yaml -# namespace: jm-live-dev -# shared-configs[0]: -# group: sentinel -# data-id: sentinel-shared.yaml -# refresh: true diff --git a/server/serving-biz/src/main/resources/application-pro.yml b/server/serving-biz/src/main/resources/application-pro.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/server/serving-biz/src/main/resources/application.yml b/server/serving-biz/src/main/resources/application.yml deleted file mode 100644 index d078a64e..00000000 --- a/server/serving-biz/src/main/resources/application.yml +++ /dev/null @@ -1,28 +0,0 @@ -spring: - application: - name: cskefu-biz - profiles: - active: dev - datasource: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - hikari: - connection-timeout: 5000 - minimum-idle: 5 - maximum-pool-size: 20 - auto-commit: false - idle-timeout: 600000 - pool-name: DataSourceHikariCP - max-lifetime: 1800000 - connection-test-query: select 1 - redis: - host: 127.0.0.1 - port: 6379 - timeout: 5000 - database: 0 - lettuce: - pool: - max-active: 8 - max-idle: 8 - min-idle: 0 - max-wait: -1ms diff --git a/server/serving-common/pom.xml b/server/serving-common/pom.xml deleted file mode 100644 index 28dcca1f..00000000 --- a/server/serving-common/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - com.cskefu - cskefu-common - 0.0.1-SNAPSHOT - 4.0.0 - cskefu-common - https://www.cskefu.com/ - - UTF-8 - 11 - 11 - 11 - 2.7.4 - 2021.0.4 - 2.2.2 - 1.18.6 - 8.0.30 - 3.17.7 - 3.0.0 - 2.13.4 - - - - org.projectlombok - lombok - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud.version}.0 - pom - import - - - - diff --git a/server/serving-common/src/main/java/com/cskefu/common/BaseEntity.java b/server/serving-common/src/main/java/com/cskefu/common/BaseEntity.java deleted file mode 100644 index f29c3b5a..00000000 --- a/server/serving-common/src/main/java/com/cskefu/common/BaseEntity.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.cskefu.common; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; -import java.util.Date; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class BaseEntity implements Serializable { - private static final long serialVersionUID = -6751846719593132836L; - private T id; - private Date createTime; - private Date updateTime; - private String creator; - private String updator; - private Boolean deleted; - private Integer version; -} diff --git a/server/serving-common/src/main/java/com/cskefu/common/Result.java b/server/serving-common/src/main/java/com/cskefu/common/Result.java deleted file mode 100644 index 676f31e3..00000000 --- a/server/serving-common/src/main/java/com/cskefu/common/Result.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.cskefu.common; - -import lombok.Getter; - -@Getter -public class Result { - private final boolean success; - private final int code; - private final T data; - private final String message; - - Result(boolean success, int code, T data, String message) { - this.success = success; - this.code = code; - this.data = data; - this.message = message; - } - - public static ResultBuilder builder() { - return new ResultBuilder<>(); - } - - public static Result success() { - return Result.builder().code(0).success(true).build(); - } - - public static Result success(int code, T data) { - return Result.builder().code(code).success(true).data(data).build(); - } - - public static Result error(int code, String i18nMessage) { - return Result.builder().code(code).success(false).message(i18nMessage).build(); - } - - @Override - public String toString() { - return "Result(success=" + this.success + ", code=" + this.code + ", data=" + this.data + ", message=" + this.message + ")"; - } - - public static class ResultBuilder { - private boolean success; - private int code; - private T data; - private String message; - - ResultBuilder() { - } - - public ResultBuilder success(boolean success) { - this.success = success; - return this; - } - - public ResultBuilder code(int code) { - this.code = code; - return this; - } - - public ResultBuilder data(T data) { - this.data = data; - return this; - } - - public ResultBuilder message(String message) { - this.message = message; - return this; - } - - public Result build() { - return new Result(this.success, this.code, this.data, this.message); - } - - @Override - public String toString() { - return this.getClass().getName() + "(success=" + this.success + ", code=" + this.code + ", data=" + this.data + ", message=" + this.message + ")"; - } - } -} diff --git a/server/serving-conversation/pom.xml b/server/serving-conversation/pom.xml deleted file mode 100644 index 672e1349..00000000 --- a/server/serving-conversation/pom.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - com.cskefu - cskefu-conversation - 0.0.1-SNAPSHOT - 4.0.0 - cskefu-conversation - https://www.cskefu.com/ - - UTF-8 - 11 - 11 - 11 - 2.7.4 - 2021.0.4 - 2.2.2 - 1.18.6 - 8.0.30 - 3.17.7 - 3.0.0 - - - - com.cskefu - cskefu-common - 0.0.1-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-webflux - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-data-redis - - - org.springframework.boot - spring-boot-starter-validation - - - org.redisson - redisson-spring-boot-starter - ${redisson-spring.version} - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - ${mybatis-spring.version} - - - mysql - mysql-connector-java - ${mysql-connector.version} - runtime - - - io.springfox - springfox-swagger2 - ${swagger.version} - - - io.springfox - springfox-swagger-ui - ${swagger.version} - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud.version}.0 - pom - import - - - - diff --git a/server/serving-conversation/src/main/java/com/cskefu/io/CskefuConversationApplication.java b/server/serving-conversation/src/main/java/com/cskefu/io/CskefuConversationApplication.java deleted file mode 100644 index 36e98d2c..00000000 --- a/server/serving-conversation/src/main/java/com/cskefu/io/CskefuConversationApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cskefu.io; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CskefuConversationApplication { - public static void main(String[] args) { - SpringApplication.run(CskefuSessionApplication.class, args); - } -} \ No newline at end of file diff --git a/server/serving-conversation/src/main/java/com/cskefu/io/swagger/SwaggerConfiguration.java b/server/serving-conversation/src/main/java/com/cskefu/io/swagger/SwaggerConfiguration.java deleted file mode 100644 index aef1757a..00000000 --- a/server/serving-conversation/src/main/java/com/cskefu/io/swagger/SwaggerConfiguration.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.cskefu.io.swagger; - -import io.swagger.annotations.ApiOperation; -import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.*; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.contexts.SecurityContext; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -@Configuration -@EnableSwagger2 -public class SwaggerConfiguration { - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.OAS_30) - .apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) - .paths(PathSelectors.regex("(?!/error.*).*")) - .build() - .securityContexts(Arrays.asList(securityContext())) - .securitySchemes(Arrays.asList(new ApiKey("token", "token", SecuritySchemeIn.HEADER.name()))); - } - - private SecurityContext securityContext() { - return SecurityContext.builder() - .securityReferences(defaultAuth()) - //.forPaths(PathSelectors.regex("/*.*")) - .build(); - } - - private List defaultAuth() { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - return Collections.singletonList(new SecurityReference("token", authorizationScopes)); - } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("cskefu Swagger API") - .description("春松客服Swagger API") - .contact(new Contact("cskefu", "https://www.cskefu.com/", "dev@lists.cskefu.com")) - .license("Apache License Version 2.0") - .licenseUrl("http://www.apache.org/licenese/LICENSE-2.0") - .version("1.0") - .build(); - } -} \ No newline at end of file diff --git a/server/serving-conversation/src/main/resources/application-dev.yml b/server/serving-conversation/src/main/resources/application-dev.yml deleted file mode 100644 index cc21aa76..00000000 --- a/server/serving-conversation/src/main/resources/application-dev.yml +++ /dev/null @@ -1,29 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8 - username: root - password: 123456 - - cloud: - # sentinel配置 - sentinel: - eager: true - transport: - dashboard: - 127.0.0.1:8848 - port: 8719 - heartbeat-interval-ms: 5000 - nacos: - # 注册中心配置 - discovery: - server-addr: localhost:8848 - namespace: xxxxxxx -# # 配置中心 -# config: -# server-addr: 127.0.0.1:8848 -# file-extension: yaml -# namespace: jm-live-dev -# shared-configs[0]: -# group: sentinel -# data-id: sentinel-shared.yaml -# refresh: true diff --git a/server/serving-conversation/src/main/resources/application-pro.yml b/server/serving-conversation/src/main/resources/application-pro.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/server/serving-conversation/src/main/resources/application.yml b/server/serving-conversation/src/main/resources/application.yml deleted file mode 100644 index 98a843c2..00000000 --- a/server/serving-conversation/src/main/resources/application.yml +++ /dev/null @@ -1,28 +0,0 @@ -spring: - application: - name: cskefu-conversation - profiles: - active: dev - datasource: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - hikari: - connection-timeout: 5000 - minimum-idle: 5 - maximum-pool-size: 20 - auto-commit: false - idle-timeout: 600000 - pool-name: DataSourceHikariCP - max-lifetime: 1800000 - connection-test-query: select 1 - redis: - host: 127.0.0.1 - port: 6379 - timeout: 5000 - database: 0 - lettuce: - pool: - max-active: 8 - max-idle: 8 - min-idle: 0 - max-wait: -1ms diff --git a/server/serving-gateway/pom.xml b/server/serving-gateway/pom.xml deleted file mode 100644 index 5115d319..00000000 --- a/server/serving-gateway/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - com.cskefu - cskefu-gateway - 0.0.1-SNAPSHOT - 4.0.0 - cskefu-gateway - https://www.cskefu.com/ - - UTF-8 - 11 - 11 - 11 - 2.7.4 - 2021.0.4 - 2.2.2 - 1.18.6 - 8.0.30 - 3.17.7 - 3.0.0 - - - - com.cskefu - cskefu-common - 0.0.1-SNAPSHOT - - - org.springframework.cloud - spring-cloud-starter-gateway - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud.version}.0 - pom - import - - - - diff --git a/server/serving-gateway/src/main/java/com/cskefu/gateway/CskefuGatewayApplication.java b/server/serving-gateway/src/main/java/com/cskefu/gateway/CskefuGatewayApplication.java deleted file mode 100644 index ed6590e5..00000000 --- a/server/serving-gateway/src/main/java/com/cskefu/gateway/CskefuGatewayApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.cskefu.gateway; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CskefuGatewayApplication { - public static void main(String[] args) { - SpringApplication.run(CskefuGatewayApplication.class, args); - } -} \ No newline at end of file diff --git a/server/serving-gateway/src/main/resources/application-dev.yml b/server/serving-gateway/src/main/resources/application-dev.yml deleted file mode 100644 index cc21aa76..00000000 --- a/server/serving-gateway/src/main/resources/application-dev.yml +++ /dev/null @@ -1,29 +0,0 @@ -spring: - datasource: - url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8 - username: root - password: 123456 - - cloud: - # sentinel配置 - sentinel: - eager: true - transport: - dashboard: - 127.0.0.1:8848 - port: 8719 - heartbeat-interval-ms: 5000 - nacos: - # 注册中心配置 - discovery: - server-addr: localhost:8848 - namespace: xxxxxxx -# # 配置中心 -# config: -# server-addr: 127.0.0.1:8848 -# file-extension: yaml -# namespace: jm-live-dev -# shared-configs[0]: -# group: sentinel -# data-id: sentinel-shared.yaml -# refresh: true diff --git a/server/serving-gateway/src/main/resources/application-pro.yml b/server/serving-gateway/src/main/resources/application-pro.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/server/serving-gateway/src/main/resources/application.yml b/server/serving-gateway/src/main/resources/application.yml deleted file mode 100644 index 127952d2..00000000 --- a/server/serving-gateway/src/main/resources/application.yml +++ /dev/null @@ -1,5 +0,0 @@ -spring: - application: - name: cskefu-gateway - profiles: - active: dev