From b0003f0161e3695b5827ede9bfc98e2918b0888a Mon Sep 17 00:00:00 2001
From: pengys5 <8082209@qq.com>
Date: Mon, 10 Jul 2017 15:35:19 +0800
Subject: [PATCH] Provide modular development framework
---
apm-collector/apm-collector-core/pom.xml | 27 +++++++
.../collector/core/CollectorException.java | 15 ++++
.../apm/collector/core/client/Client.java | 21 +++++
.../core/client/ClientException.java | 16 ++++
.../collector/core/client/DataListener.java | 12 +++
.../core/cluster/ClusterDataInitializer.java | 24 ++++++
.../core/cluster/ClusterDefinitionFile.java | 13 +++
.../core/cluster/ClusterModuleDefine.java | 29 +++++++
.../core/cluster/ClusterModuleException.java | 17 ++++
.../apm/collector/core/cluster/Discovery.java | 9 +++
.../collector/core/cluster/Registration.java | 9 +++
.../core/config/ConfigException.java | 17 ++++
.../collector/core/config/ConfigLoader.java | 9 +++
.../core/config/ConfigLoaderException.java | 15 ++++
.../core/config/ConfigParseException.java | 15 ++++
.../core/framework/DataInitializer.java | 15 ++++
.../collector/core/framework/Decision.java | 7 ++
.../apm/collector/core/framework/Define.java | 15 ++++
.../core/framework/DefineException.java | 17 ++++
.../core/framework/DefinitionFile.java | 15 ++++
.../apm/collector/core/framework/Loader.java | 11 +++
.../core/framework/PriorityDecision.java | 31 +++++++
.../collector/core/framework/Provider.java | 8 ++
.../apm/collector/core/framework/Starter.java | 8 ++
.../apm/collector/core/framework/Writer.java | 7 ++
.../apm/collector/core/module/Module.java | 10 +++
.../core/module/ModuleConfigLoader.java | 38 +++++++++
.../module/ModuleConfigLoaderException.java | 16 ++++
.../core/module/ModuleConfigParser.java | 11 +++
.../collector/core/module/ModuleDefine.java | 34 ++++++++
.../core/module/ModuleDefinitionFile.java | 12 +++
.../core/module/ModuleException.java | 17 ++++
.../collector/core/module/ModuleGroup.java | 8 ++
.../core/module/ModuleInstaller.java | 46 +++++++++++
.../apm/collector/core/server/Server.java | 9 +++
.../core/server/ServerException.java | 17 ++++
.../core/server/ServerModuleDefine.java | 9 +++
.../collector/core/util/DefinitionLoader.java | 81 +++++++++++++++++++
.../apm/collector/core/util/ObjectUtils.java | 12 +++
.../collector/core/util/ResourceUtils.java | 16 ++++
.../apm/collector/core/util/StringUtils.java | 15 ++++
.../core/worker/WorkerModuleDefine.java | 34 ++++++++
.../core/worker/WorkerModuleException.java | 17 ++++
.../src/main/resources/logback.xml | 14 ++++
.../config/ModuleConfigLoaderTestCase.java | 18 +++++
.../core/module/ClusterModuleForTest.java | 17 ++++
.../core/module/ModuleInstallerTestCase.java | 19 +++++
.../resources/META-INF/defines/module.define | 1 +
.../src/test/resources/application.yml | 8 ++
.../src/test/resources/logback-test.xml | 12 +++
50 files changed, 873 insertions(+)
create mode 100644 apm-collector/apm-collector-core/pom.xml
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/CollectorException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/Client.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/ClientException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/DataListener.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDataInitializer.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDefinitionFile.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Discovery.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Registration.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoaderException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigParseException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DataInitializer.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Decision.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefineException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefinitionFile.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/PriorityDecision.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Provider.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Writer.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoaderException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigParser.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefine.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefinitionFile.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleGroup.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleInstaller.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/Server.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerException.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerModuleDefine.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ObjectUtils.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ResourceUtils.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/StringUtils.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleDefine.java
create mode 100644 apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleException.java
create mode 100644 apm-collector/apm-collector-core/src/main/resources/logback.xml
create mode 100644 apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/config/ModuleConfigLoaderTestCase.java
create mode 100644 apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ClusterModuleForTest.java
create mode 100644 apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleInstallerTestCase.java
create mode 100644 apm-collector/apm-collector-core/src/test/resources/META-INF/defines/module.define
create mode 100644 apm-collector/apm-collector-core/src/test/resources/application.yml
create mode 100644 apm-collector/apm-collector-core/src/test/resources/logback-test.xml
diff --git a/apm-collector/apm-collector-core/pom.xml b/apm-collector/apm-collector-core/pom.xml
new file mode 100644
index 000000000..c68a10e86
--- /dev/null
+++ b/apm-collector/apm-collector-core/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ apm-collector
+ org.skywalking
+ 3.2-2017
+
+ 4.0.0
+
+ apm-collector-core
+ jar
+
+
+
+ org.yaml
+ snakeyaml
+ 1.18
+
+
+ ch.qos.logback
+ logback-classic
+ 1.2.3
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/CollectorException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/CollectorException.java
new file mode 100644
index 000000000..f541218f9
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/CollectorException.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.core;
+
+/**
+ * @author pengys5
+ */
+public class CollectorException extends Exception {
+
+ public CollectorException(String message) {
+ super(message);
+ }
+
+ public CollectorException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/Client.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/Client.java
new file mode 100644
index 000000000..661792e71
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/Client.java
@@ -0,0 +1,21 @@
+package org.skywalking.apm.collector.core.client;
+
+/**
+ * @author pengys5
+ */
+public interface Client {
+
+ void initialize() throws ClientException;
+
+ void insert(String path) throws ClientException;
+
+ void update();
+
+ String select(String path) throws ClientException;
+
+ void delete();
+
+ boolean exist(String path) throws ClientException;
+
+ void listen(String path) throws ClientException;
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/ClientException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/ClientException.java
new file mode 100644
index 000000000..8b7be888e
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/ClientException.java
@@ -0,0 +1,16 @@
+package org.skywalking.apm.collector.core.client;
+
+import org.skywalking.apm.collector.core.CollectorException;
+
+/**
+ * @author pengys5
+ */
+public abstract class ClientException extends CollectorException {
+ public ClientException(String message) {
+ super(message);
+ }
+
+ public ClientException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/DataListener.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/DataListener.java
new file mode 100644
index 000000000..1022d39aa
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/client/DataListener.java
@@ -0,0 +1,12 @@
+package org.skywalking.apm.collector.core.client;
+
+import java.util.List;
+
+/**
+ * @author pengys5
+ */
+public interface DataListener {
+ List items();
+
+ void listen() throws ClientException;
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDataInitializer.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDataInitializer.java
new file mode 100644
index 000000000..3be6aeaee
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDataInitializer.java
@@ -0,0 +1,24 @@
+package org.skywalking.apm.collector.core.cluster;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+import org.skywalking.apm.collector.core.framework.DataInitializer;
+
+/**
+ * @author pengys5
+ */
+public abstract class ClusterDataInitializer implements DataInitializer {
+
+ public static final String BASE_CATALOG = "collector.cluster";
+ public static final String FOR_UI_CATALOG = BASE_CATALOG + ".ui";
+ public static final String FOR_AGENT_CATALOG = BASE_CATALOG + ".agent";
+
+ @Override public final void initialize(Client client) throws ClientException {
+ if (!existItem(client, FOR_UI_CATALOG)) {
+ addItem(client, FOR_UI_CATALOG);
+ }
+ if (!existItem(client, FOR_AGENT_CATALOG)) {
+ addItem(client, FOR_AGENT_CATALOG);
+ }
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDefinitionFile.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDefinitionFile.java
new file mode 100644
index 000000000..aa1bb7b54
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterDefinitionFile.java
@@ -0,0 +1,13 @@
+package org.skywalking.apm.collector.core.cluster;
+
+import org.skywalking.apm.collector.core.framework.DefinitionFile;
+
+/**
+ * @author pengys5
+ */
+public class ClusterDefinitionFile extends DefinitionFile {
+
+ @Override protected String fileName() {
+ return "cluster-configuration.define";
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java
new file mode 100644
index 000000000..2ac18f2f2
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleDefine.java
@@ -0,0 +1,29 @@
+package org.skywalking.apm.collector.core.cluster;
+
+import java.util.Map;
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+import org.skywalking.apm.collector.core.config.ConfigParseException;
+import org.skywalking.apm.collector.core.module.ModuleDefine;
+import org.skywalking.apm.collector.core.server.Server;
+
+/**
+ * @author pengys5
+ */
+public abstract class ClusterModuleDefine extends ModuleDefine {
+
+ @Override public final void initialize(Map config) throws ClusterModuleException {
+ try {
+ configParser().parse(config);
+ Client client = client();
+ client.initialize();
+ dataInitializer().initialize(client);
+ } catch (ConfigParseException | ClientException e) {
+ throw new ClusterModuleException(e.getMessage(), e);
+ }
+ }
+
+ @Override public final Server server() {
+ throw new UnsupportedOperationException("");
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleException.java
new file mode 100644
index 000000000..3171f58b2
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/ClusterModuleException.java
@@ -0,0 +1,17 @@
+package org.skywalking.apm.collector.core.cluster;
+
+import org.skywalking.apm.collector.core.module.ModuleException;
+
+/**
+ * @author pengys5
+ */
+public class ClusterModuleException extends ModuleException {
+
+ public ClusterModuleException(String message) {
+ super(message);
+ }
+
+ public ClusterModuleException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Discovery.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Discovery.java
new file mode 100644
index 000000000..0957d5125
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Discovery.java
@@ -0,0 +1,9 @@
+package org.skywalking.apm.collector.core.cluster;
+
+/**
+ * @author pengys5
+ */
+public interface Discovery {
+
+ void discover();
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Registration.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Registration.java
new file mode 100644
index 000000000..c37bb83bb
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/cluster/Registration.java
@@ -0,0 +1,9 @@
+package org.skywalking.apm.collector.core.cluster;
+
+/**
+ * @author pengys5
+ */
+public interface Registration {
+
+ void register();
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigException.java
new file mode 100644
index 000000000..4d6f3f32c
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigException.java
@@ -0,0 +1,17 @@
+package org.skywalking.apm.collector.core.config;
+
+import org.skywalking.apm.collector.core.CollectorException;
+
+/**
+ * @author pengys5
+ */
+public abstract class ConfigException extends CollectorException {
+
+ public ConfigException(String message) {
+ super(message);
+ }
+
+ public ConfigException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java
new file mode 100644
index 000000000..06e1cff84
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoader.java
@@ -0,0 +1,9 @@
+package org.skywalking.apm.collector.core.config;
+
+import org.skywalking.apm.collector.core.framework.Loader;
+
+/**
+ * @author pengys5
+ */
+public interface ConfigLoader extends Loader {
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoaderException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoaderException.java
new file mode 100644
index 000000000..98abef0e4
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigLoaderException.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.core.config;
+
+/**
+ * @author pengys5
+ */
+public abstract class ConfigLoaderException extends ConfigException {
+
+ public ConfigLoaderException(String message) {
+ super(message);
+ }
+
+ public ConfigLoaderException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigParseException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigParseException.java
new file mode 100644
index 000000000..474abdce9
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/config/ConfigParseException.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.core.config;
+
+/**
+ * @author pengys5
+ */
+public class ConfigParseException extends ConfigException {
+
+ public ConfigParseException(String message) {
+ super(message);
+ }
+
+ public ConfigParseException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DataInitializer.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DataInitializer.java
new file mode 100644
index 000000000..1c9fc0c05
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DataInitializer.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.core.framework;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.client.ClientException;
+
+/**
+ * @author pengys5
+ */
+public interface DataInitializer {
+ void initialize(Client client) throws ClientException;
+
+ void addItem(Client client, String itemKey) throws ClientException;
+
+ boolean existItem(Client client, String itemKey) throws ClientException;
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Decision.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Decision.java
new file mode 100644
index 000000000..15c61fb7a
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Decision.java
@@ -0,0 +1,7 @@
+package org.skywalking.apm.collector.core.framework;
+
+/**
+ * @author pengys5
+ */
+public interface Decision {
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java
new file mode 100644
index 000000000..591a38343
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Define.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.core.framework;
+
+import java.util.Map;
+
+/**
+ * @author pengys5
+ */
+public interface Define {
+
+ void initialize(Map config) throws DefineException;
+
+ String getName();
+
+ void setName(String name);
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefineException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefineException.java
new file mode 100644
index 000000000..ff3401b80
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefineException.java
@@ -0,0 +1,17 @@
+package org.skywalking.apm.collector.core.framework;
+
+import org.skywalking.apm.collector.core.CollectorException;
+
+/**
+ * @author pengys5
+ */
+public abstract class DefineException extends CollectorException {
+
+ public DefineException(String message) {
+ super(message);
+ }
+
+ public DefineException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefinitionFile.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefinitionFile.java
new file mode 100644
index 000000000..dae247d78
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/DefinitionFile.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.core.framework;
+
+/**
+ * @author pengys5
+ */
+public abstract class DefinitionFile {
+
+ private final String CATALOG = "META-INF/defines/";
+
+ protected abstract String fileName();
+
+ public final String get() {
+ return CATALOG + fileName();
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java
new file mode 100644
index 000000000..70957c8a4
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Loader.java
@@ -0,0 +1,11 @@
+package org.skywalking.apm.collector.core.framework;
+
+import org.skywalking.apm.collector.core.config.ConfigException;
+
+/**
+ * @author pengys5
+ */
+public interface Loader {
+
+ void load() throws ConfigException;
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/PriorityDecision.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/PriorityDecision.java
new file mode 100644
index 000000000..0f19d746c
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/PriorityDecision.java
@@ -0,0 +1,31 @@
+package org.skywalking.apm.collector.core.framework;
+
+import java.util.List;
+
+/**
+ * @author pengys5
+ */
+public class PriorityDecision implements Decision {
+
+ public Object decide(List source) {
+ return source.get(0);
+ }
+
+ public static class Priority {
+ private final int value;
+ private final Object object;
+
+ public Priority(int value, Object object) {
+ this.value = value;
+ this.object = object;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public Object getObject() {
+ return object;
+ }
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Provider.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Provider.java
new file mode 100644
index 000000000..222c1e9fb
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Provider.java
@@ -0,0 +1,8 @@
+package org.skywalking.apm.collector.core.framework;
+
+/**
+ * @author pengys5
+ */
+public interface Provider {
+ D create();
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java
new file mode 100644
index 000000000..8d7a4f8fe
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Starter.java
@@ -0,0 +1,8 @@
+package org.skywalking.apm.collector.core.framework;
+
+/**
+ * @author pengys5
+ */
+public interface Starter {
+ void start();
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Writer.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Writer.java
new file mode 100644
index 000000000..68c40c065
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/framework/Writer.java
@@ -0,0 +1,7 @@
+package org.skywalking.apm.collector.core.framework;
+
+/**
+ * @author pengys5
+ */
+public interface Writer {
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java
new file mode 100644
index 000000000..8d3f57145
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/Module.java
@@ -0,0 +1,10 @@
+package org.skywalking.apm.collector.core.module;
+
+import java.util.Map;
+
+/**
+ * @author pengys5
+ */
+public interface Module {
+ void install(Map configuration);
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java
new file mode 100644
index 000000000..f3d882e53
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoader.java
@@ -0,0 +1,38 @@
+package org.skywalking.apm.collector.core.module;
+
+import java.io.FileNotFoundException;
+import java.util.Map;
+import org.skywalking.apm.collector.core.config.ConfigLoader;
+import org.skywalking.apm.collector.core.util.ResourceUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * @author pengys5
+ */
+public class ModuleConfigLoader implements ConfigLoader {
+
+ private final Logger logger = LoggerFactory.getLogger(ModuleConfigLoader.class);
+
+ @Override public void load() throws ModuleConfigLoaderException {
+ Yaml yaml = new Yaml();
+ ModuleInstaller installer = new ModuleInstaller();
+
+ Map configurations = null;
+ try {
+ configurations = (Map)yaml.load(ResourceUtils.read("application.yml"));
+ } catch (FileNotFoundException e) {
+ throw new ModuleConfigLoaderException(e.getMessage(), e);
+ }
+ configurations.forEach((moduleName, moduleConfig) -> {
+ logger.info("module name \"{}\" from application.yml", moduleName);
+ try {
+ installer.install(moduleName, moduleConfig);
+ } catch (ModuleException e) {
+ logger.error("module \"{}\" install failure", moduleName);
+ logger.error(e.getMessage(), e);
+ }
+ });
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoaderException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoaderException.java
new file mode 100644
index 000000000..9143d0197
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigLoaderException.java
@@ -0,0 +1,16 @@
+package org.skywalking.apm.collector.core.module;
+
+import org.skywalking.apm.collector.core.config.ConfigLoaderException;
+
+/**
+ * @author pengys5
+ */
+public class ModuleConfigLoaderException extends ConfigLoaderException {
+ public ModuleConfigLoaderException(String message) {
+ super(message);
+ }
+
+ public ModuleConfigLoaderException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigParser.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigParser.java
new file mode 100644
index 000000000..1f2fbd941
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleConfigParser.java
@@ -0,0 +1,11 @@
+package org.skywalking.apm.collector.core.module;
+
+import java.util.Map;
+import org.skywalking.apm.collector.core.config.ConfigParseException;
+
+/**
+ * @author pengys5
+ */
+public interface ModuleConfigParser {
+ void parse(Map config) throws ConfigParseException;
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefine.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefine.java
new file mode 100644
index 000000000..e6a661350
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefine.java
@@ -0,0 +1,34 @@
+package org.skywalking.apm.collector.core.module;
+
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.framework.DataInitializer;
+import org.skywalking.apm.collector.core.framework.Define;
+import org.skywalking.apm.collector.core.server.Server;
+
+/**
+ * @author pengys5
+ */
+public abstract class ModuleDefine implements Define {
+
+ private String moduleName;
+
+ @Override public final String getName() {
+ return moduleName;
+ }
+
+ @Override public final void setName(String name) {
+ this.moduleName = name;
+ }
+
+ protected abstract ModuleGroup group();
+
+ protected abstract boolean defaultModule();
+
+ protected abstract ModuleConfigParser configParser();
+
+ protected abstract Client client();
+
+ protected abstract Server server();
+
+ protected abstract DataInitializer dataInitializer();
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefinitionFile.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefinitionFile.java
new file mode 100644
index 000000000..dbe447e7a
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleDefinitionFile.java
@@ -0,0 +1,12 @@
+package org.skywalking.apm.collector.core.module;
+
+import org.skywalking.apm.collector.core.framework.DefinitionFile;
+
+/**
+ * @author pengys5
+ */
+public class ModuleDefinitionFile extends DefinitionFile {
+ @Override protected String fileName() {
+ return "module.define";
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleException.java
new file mode 100644
index 000000000..0a58ce366
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleException.java
@@ -0,0 +1,17 @@
+package org.skywalking.apm.collector.core.module;
+
+import org.skywalking.apm.collector.core.framework.DefineException;
+
+/**
+ * @author pengys5
+ */
+public abstract class ModuleException extends DefineException {
+
+ public ModuleException(String message) {
+ super(message);
+ }
+
+ public ModuleException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleGroup.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleGroup.java
new file mode 100644
index 000000000..3732640ea
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleGroup.java
@@ -0,0 +1,8 @@
+package org.skywalking.apm.collector.core.module;
+
+/**
+ * @author pengys5
+ */
+public enum ModuleGroup {
+ Cluster, Worker, Queue
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleInstaller.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleInstaller.java
new file mode 100644
index 000000000..61b1dc866
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/module/ModuleInstaller.java
@@ -0,0 +1,46 @@
+package org.skywalking.apm.collector.core.module;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.skywalking.apm.collector.core.framework.DefineException;
+import org.skywalking.apm.collector.core.util.DefinitionLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class ModuleInstaller {
+
+ private final Logger logger = LoggerFactory.getLogger(ModuleInstaller.class);
+
+ private final Map moduleDefineMap;
+
+ protected ModuleInstaller() {
+ moduleDefineMap = new LinkedHashMap<>();
+ ModuleDefinitionFile definitionFile = new ModuleDefinitionFile();
+ logger.info("definition file name: {}", definitionFile.fileName());
+ DefinitionLoader definitionLoader = DefinitionLoader.load(ModuleDefine.class, definitionFile);
+ for (ModuleDefine moduleDefine : definitionLoader) {
+ logger.info("loaded module class: {}", moduleDefine.getClass().getName());
+ moduleDefineMap.put(moduleDefine.getName(), moduleDefine);
+ }
+ }
+
+ public void install(String moduleName, Map moduleConfig) throws ModuleException {
+ Map module = (LinkedHashMap)moduleConfig;
+ module.entrySet().forEach(subModuleConfig -> {
+ String subMoudleName = moduleName + "." + subModuleConfig.getKey();
+ logger.info("install sub module {}", subMoudleName);
+ try {
+ if (moduleDefineMap.containsKey(subMoudleName)) {
+ moduleDefineMap.get(subMoudleName).initialize(subModuleConfig.getValue());
+ } else {
+ logger.error("could not found the module definition, module name: {}", subMoudleName);
+ }
+ } catch (DefineException e) {
+ logger.error(e.getMessage(), e);
+ }
+ });
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/Server.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/Server.java
new file mode 100644
index 000000000..eede89b81
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/Server.java
@@ -0,0 +1,9 @@
+package org.skywalking.apm.collector.core.server;
+
+/**
+ * @author pengys5
+ */
+public interface Server {
+
+ void initialize() throws ServerException;
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerException.java
new file mode 100644
index 000000000..30d37f9aa
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerException.java
@@ -0,0 +1,17 @@
+package org.skywalking.apm.collector.core.server;
+
+import org.skywalking.apm.collector.core.CollectorException;
+
+/**
+ * @author pengys5
+ */
+public abstract class ServerException extends CollectorException {
+
+ public ServerException(String message) {
+ super(message);
+ }
+
+ public ServerException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerModuleDefine.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerModuleDefine.java
new file mode 100644
index 000000000..5f580ff34
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/server/ServerModuleDefine.java
@@ -0,0 +1,9 @@
+package org.skywalking.apm.collector.core.server;
+
+import org.skywalking.apm.collector.core.module.ModuleDefine;
+
+/**
+ * @author pengys5
+ */
+public abstract class ServerModuleDefine extends ModuleDefine {
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java
new file mode 100644
index 000000000..bd5164620
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/DefinitionLoader.java
@@ -0,0 +1,81 @@
+package org.skywalking.apm.collector.core.util;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import org.skywalking.apm.collector.core.framework.Define;
+import org.skywalking.apm.collector.core.framework.DefinitionFile;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class DefinitionLoader implements Iterable {
+
+ private final Logger logger = LoggerFactory.getLogger(DefinitionLoader.class);
+
+ private final Class definition;
+ private final DefinitionFile definitionFile;
+
+ protected DefinitionLoader(Class svc, DefinitionFile definitionFile) {
+ this.definition = Objects.requireNonNull(svc, "definition interface cannot be null");
+ this.definitionFile = definitionFile;
+ }
+
+ public static DefinitionLoader load(Class definition, DefinitionFile definitionFile) {
+ return new DefinitionLoader(definition, definitionFile);
+ }
+
+ @Override public final Iterator iterator() {
+ logger.info("load definition file: {}", definitionFile.get());
+ Properties properties = new Properties();
+ Map definitionList = new LinkedHashMap<>();
+ try {
+ Enumeration urlEnumeration = this.getClass().getClassLoader().getResources(definitionFile.get());
+ while (urlEnumeration.hasMoreElements()) {
+ URL definitionFileURL = urlEnumeration.nextElement();
+ logger.info("definition file url: {}", definitionFileURL.getPath());
+ properties.load(new FileReader(definitionFileURL.getPath()));
+
+ Enumeration defineItem = properties.propertyNames();
+ while (defineItem.hasMoreElements()) {
+ String key = (String)defineItem.nextElement();
+ String fullNameClass = properties.getProperty(key);
+ definitionList.put(key, fullNameClass);
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ Iterator> moduleDefineIterator = definitionList.entrySet().iterator();
+
+ return new Iterator() {
+ @Override public boolean hasNext() {
+ return moduleDefineIterator.hasNext();
+ }
+
+ @Override public D next() {
+ Map.Entry moduleDefineEntry = moduleDefineIterator.next();
+ String definitionName = moduleDefineEntry.getKey();
+ String definitionClass = moduleDefineEntry.getValue();
+ logger.info("key: {}, definitionClass: {}", definitionName, definitionClass);
+ try {
+ Class c = Class.forName(definitionClass);
+ Define define = (Define)c.newInstance();
+ define.setName(definitionName);
+ return (D)define;
+ } catch (Exception e) {
+ }
+ return null;
+ }
+ };
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ObjectUtils.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ObjectUtils.java
new file mode 100644
index 000000000..f65b38d32
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ObjectUtils.java
@@ -0,0 +1,12 @@
+package org.skywalking.apm.collector.core.util;
+
+import com.sun.istack.internal.Nullable;
+
+/**
+ * @author pengys5
+ */
+public class ObjectUtils {
+ public static boolean isEmpty(@Nullable Object obj) {
+ return obj == null;
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ResourceUtils.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ResourceUtils.java
new file mode 100644
index 000000000..31daeec6f
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/ResourceUtils.java
@@ -0,0 +1,16 @@
+package org.skywalking.apm.collector.core.util;
+
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+
+/**
+ * @author pengys5
+ */
+public class ResourceUtils {
+
+ private static final String PATH = ResourceUtils.class.getResource("/").getPath();
+
+ public static FileReader read(String fileName) throws FileNotFoundException {
+ return new FileReader(PATH + fileName);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/StringUtils.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/StringUtils.java
new file mode 100644
index 000000000..c1b0ab3de
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/util/StringUtils.java
@@ -0,0 +1,15 @@
+package org.skywalking.apm.collector.core.util;
+
+import com.sun.istack.internal.Nullable;
+
+/**
+ * @author pengys5
+ */
+public class StringUtils {
+
+ public static final String EMPTY_STRING = "";
+
+ public static boolean isEmpty(@Nullable Object str) {
+ return (str == null || EMPTY_STRING.equals(str));
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleDefine.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleDefine.java
new file mode 100644
index 000000000..f337a1de5
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleDefine.java
@@ -0,0 +1,34 @@
+package org.skywalking.apm.collector.core.worker;
+
+import java.util.Map;
+import org.skywalking.apm.collector.core.client.Client;
+import org.skywalking.apm.collector.core.config.ConfigParseException;
+import org.skywalking.apm.collector.core.framework.DataInitializer;
+import org.skywalking.apm.collector.core.module.ModuleDefine;
+import org.skywalking.apm.collector.core.module.ModuleException;
+import org.skywalking.apm.collector.core.server.Server;
+import org.skywalking.apm.collector.core.server.ServerException;
+
+/**
+ * @author pengys5
+ */
+public abstract class WorkerModuleDefine extends ModuleDefine {
+
+ @Override public final void initialize(Map config) throws ModuleException {
+ try {
+ configParser().parse(config);
+ Server server = server();
+ server.initialize();
+ } catch (ConfigParseException | ServerException e) {
+ throw new WorkerModuleException(e.getMessage(), e);
+ }
+ }
+
+ @Override public final Client client() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override public final DataInitializer dataInitializer() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleException.java b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleException.java
new file mode 100644
index 000000000..339968f61
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/java/org/skywalking/apm/collector/core/worker/WorkerModuleException.java
@@ -0,0 +1,17 @@
+package org.skywalking.apm.collector.core.worker;
+
+import org.skywalking.apm.collector.core.module.ModuleException;
+
+/**
+ * @author pengys5
+ */
+public class WorkerModuleException extends ModuleException {
+
+ public WorkerModuleException(String message) {
+ super(message);
+ }
+
+ public WorkerModuleException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/main/resources/logback.xml b/apm-collector/apm-collector-core/src/main/resources/logback.xml
new file mode 100644
index 000000000..b0df07af4
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/main/resources/logback.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/config/ModuleConfigLoaderTestCase.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/config/ModuleConfigLoaderTestCase.java
new file mode 100644
index 000000000..85f802f23
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/config/ModuleConfigLoaderTestCase.java
@@ -0,0 +1,18 @@
+package org.skywalking.apm.collector.core.config;
+
+import java.io.FileNotFoundException;
+import org.junit.Test;
+import org.skywalking.apm.collector.core.module.ModuleConfigLoader;
+import org.skywalking.apm.collector.core.module.ModuleConfigLoaderException;
+
+/**
+ * @author pengys5
+ */
+public class ModuleConfigLoaderTestCase {
+
+ @Test
+ public void testLoad() throws ModuleConfigLoaderException {
+ ModuleConfigLoader loader = new ModuleConfigLoader();
+ loader.load();
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ClusterModuleForTest.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ClusterModuleForTest.java
new file mode 100644
index 000000000..b6ece3746
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ClusterModuleForTest.java
@@ -0,0 +1,17 @@
+package org.skywalking.apm.collector.core.module;
+
+import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author pengys5
+ */
+public class ClusterModuleForTest implements Module {
+
+ private final Logger logger = LoggerFactory.getLogger(ModuleInstaller.class);
+
+ @Override public void install(Map configuration) {
+ logger.debug(configuration.toString());
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleInstallerTestCase.java b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleInstallerTestCase.java
new file mode 100644
index 000000000..9032bb145
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/test/java/org/skywalking/apm/collector/core/module/ModuleInstallerTestCase.java
@@ -0,0 +1,19 @@
+package org.skywalking.apm.collector.core.module;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author pengys5
+ */
+public class ModuleInstallerTestCase {
+
+ @Before
+ public void init() {
+ }
+
+ @Test
+ public void testInstall() {
+ ModuleInstaller installer = new ModuleInstaller();
+ }
+}
diff --git a/apm-collector/apm-collector-core/src/test/resources/META-INF/defines/module.define b/apm-collector/apm-collector-core/src/test/resources/META-INF/defines/module.define
new file mode 100644
index 000000000..5d6f8c358
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/test/resources/META-INF/defines/module.define
@@ -0,0 +1 @@
+cluster=org.skywalking.apm.collector.core.module.ClusterModuleForTest
\ No newline at end of file
diff --git a/apm-collector/apm-collector-core/src/test/resources/application.yml b/apm-collector/apm-collector-core/src/test/resources/application.yml
new file mode 100644
index 000000000..ec549438f
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/test/resources/application.yml
@@ -0,0 +1,8 @@
+cluster:
+ zookeeper:
+ host: localhost-zk
+ port: 1000
+ redis:
+ host: localhost-rd
+ port: 2000
+
diff --git a/apm-collector/apm-collector-core/src/test/resources/logback-test.xml b/apm-collector/apm-collector-core/src/test/resources/logback-test.xml
new file mode 100644
index 000000000..9b51230a9
--- /dev/null
+++ b/apm-collector/apm-collector-core/src/test/resources/logback-test.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
\ No newline at end of file