diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..c02456b
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,59 @@
+# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven
+
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+name: Deploy Java jar with maven
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout project
+ uses: actions/checkout@v3
+
+ - name: Set up JDK 11
+ uses: actions/setup-java@v3
+ with:
+ java-version: '11'
+ distribution: 'temurin'
+ server-id: ossrh
+ server-username: MAVEN_USERNAME
+ server-password: MAVEN_PASSWORD
+ gpg-private-key: ${{ secrets.HIGHFLIP_GPG_SECRET_KEY }}
+ gpg-passphrase: MAVEN_GPG_PASSPHRASE
+
+ - name: Build with Maven
+ run: mvn -B package -DskipTests -Prelease --file pom.xml
+
+ - name: Set up Apache Maven Central
+ uses: actions/setup-java@v3
+ with: # running setup-java again overwrites the settings.xml
+ java-version: '11'
+ distribution: 'temurin'
+ server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml
+ server-username: MAVEN_USERNAME # env variable for username in deploy
+ server-password: MAVEN_PASSWORD # env variable for token in deploy
+ gpg-private-key: ${{ secrets.HIGHFLIP_GPG_SECRET_KEY }} # Value of the GPG private key to import
+ gpg-passphrase: MAVEN_GPG_PASSPHRASE # env variable for GPG private key passphrase
+
+ - name: Publish to the Maven Central Repository
+ run:
+ mvn clean --no-transfer-progress --batch-mode -Prelease -DskipTests deploy --file pom.xml -pl highflip-proto,highflip-core,highflip-clients/highflip-sdk -am
+ env:
+ MAVEN_USERNAME: ${{ secrets.HIGHFLIP_MAVEN_USERNAME }}
+ MAVEN_PASSWORD: ${{ secrets.HIGHFLIP_MAVEN_TOKEN }}
+ MAVEN_GPG_PASSPHRASE: ${{ secrets.HIGHFLIP_GPG_SECRET_KEY_PASSWORD }}
+
+ # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
+ # - name: Update dependency graph
+ # uses: advanced-security/maven-dependency-submission-action@v2.0.1
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 1d25004..2431618 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -6,13 +6,12 @@
# separate terms of service, privacy policy, and support
# documentation.
-name: Java CI with Maven
+name: Build Java Project
on:
push:
- branches: [ "master" ]
pull_request:
- branches: [ "master" ]
+ workflow_dispatch:
jobs:
build:
@@ -20,16 +19,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - name: Set up JDK 11
- uses: actions/setup-java@v3
- with:
- java-version: '11'
- distribution: 'temurin'
- cache: maven
- - name: Build with Maven
- run: mvn -B package --file pom.xml
-
- # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
- # - name: Update dependency graph
- # uses: advanced-security/maven-dependency-submission-action@v2.0.1
+ - name: Checkout project
+ uses: actions/checkout@v3
+
+ - name: Set up JDK 11
+ uses: actions/setup-java@v3
+ with:
+ java-version: '11'
+ distribution: 'temurin'
+
+ - name: Build with Maven
+ run: mvn -B package -DskipTests -Prelease --file pom.xml
diff --git a/highflip-build/pom.xml b/highflip-build/pom.xml
index 6d5cf4e..5ae3101 100644
--- a/highflip-build/pom.xml
+++ b/highflip-build/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- com.baidu
+ com.baidu.highflip
highflip-build
jar
1.0.0-SNAPSHOT
diff --git a/highflip-clients/highflip-console/pom.xml b/highflip-clients/highflip-console/pom.xml
index 3047fff..1815e6d 100644
--- a/highflip-clients/highflip-console/pom.xml
+++ b/highflip-clients/highflip-console/pom.xml
@@ -11,16 +11,16 @@
-->
- com.baidu
+ com.baidu.highflip
highflip-console
1.0.0-SNAPSHOT
highflip-console
- com.baidu
- highflip
+ com.baidu.highflip
+ highflip-clients
1.0.0-SNAPSHOT
- ../../pom.xml
+ ../pom.xml
@@ -44,7 +44,7 @@
spring-boot-starter-json
- com.baidu
+ com.baidu.highflip
highflip-sdk
1.0.0-SNAPSHOT
diff --git a/highflip-clients/highflip-console/src/main/java/com/baidu/highflip/console/commands/TaskCommand.java b/highflip-clients/highflip-console/src/main/java/com/baidu/highflip/console/commands/TaskCommand.java
index 724295b..5c969f0 100644
--- a/highflip-clients/highflip-console/src/main/java/com/baidu/highflip/console/commands/TaskCommand.java
+++ b/highflip-clients/highflip-console/src/main/java/com/baidu/highflip/console/commands/TaskCommand.java
@@ -17,12 +17,13 @@ public class TaskCommand {
@Autowired
HighFlipClient client;
- @ShellMethod(key = "task list", value = "List all task ids")
+ @ShellMethod(key = "task list", value = "List job all task ids")
public Iterable list(
+ @ShellOption String jobId,
@ShellOption(defaultValue = "0") Integer offset,
@ShellOption(defaultValue = "0") Integer limit) {
- return client.listTasks(offset, limit);
+ return client.listTasks(jobId, offset, limit);
}
@ShellMethod(key = "task get", value = "Get a task information")
diff --git a/highflip-clients/highflip-sdk/pom.xml b/highflip-clients/highflip-sdk/pom.xml
index d982e95..49e9514 100644
--- a/highflip-clients/highflip-sdk/pom.xml
+++ b/highflip-clients/highflip-sdk/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- com.baidu
+ com.baidu.highflip
highflip-sdk
jar
1.0.0-SNAPSHOT
@@ -10,17 +10,17 @@
https://maven.apache.org
- com.baidu
- highflip
+ com.baidu.highflip
+ highflip-clients
1.0.0-SNAPSHOT
- ../../pom.xml
+ ../pom.xml
- com.baidu
+ com.baidu.highflip
highflip-proto
- 1.0.0-SNAPSHOT
+ ${project.version}
org.projectlombok
diff --git a/highflip-clients/highflip-sdk/src/main/java/com/baidu/highflip/client/HighFlipClient.java b/highflip-clients/highflip-sdk/src/main/java/com/baidu/highflip/client/HighFlipClient.java
index 9a57d8c..3cd80e0 100644
--- a/highflip-clients/highflip-sdk/src/main/java/com/baidu/highflip/client/HighFlipClient.java
+++ b/highflip-clients/highflip-sdk/src/main/java/com/baidu/highflip/client/HighFlipClient.java
@@ -42,6 +42,12 @@ public HighFlipClient() {
this.blockingStub = null;
}
+ public static HighFlipClient newHighFlipClient(String target) {
+ HighFlipClient highFlipClient = new HighFlipClient();
+ highFlipClient.connect(target);
+ return highFlipClient;
+ }
+
public void connect(String target) {
close();
@@ -283,13 +289,17 @@ public Iterable getJobLog(String jobId){
/**
*
+ * @param jobId job id in highflip
* @param offset
* @param limit
* @return
*/
- public Iterable listTasks(int offset, int limit){
+ public Iterable listTasks(String jobId, int offset, int limit) {
Highflip.TaskListRequest request = Highflip.TaskListRequest
.newBuilder()
+ .setJobId(jobId)
+ .setOffset(offset)
+ .setLimit(limit)
.build();
Iterator response = getBlockingStub()
diff --git a/highflip-clients/pom.xml b/highflip-clients/pom.xml
index 3de5034..1457d0f 100644
--- a/highflip-clients/pom.xml
+++ b/highflip-clients/pom.xml
@@ -4,13 +4,13 @@
highflip
- com.baidu
+ com.baidu.highflip
1.0.0-SNAPSHOT
../pom.xml
- com.baidu
+ com.baidu.highflip
highflip-clients
1.0.0-SNAPSHOT
pom
diff --git a/highflip-core/pom.xml b/highflip-core/pom.xml
index ff39144..22b019e 100644
--- a/highflip-core/pom.xml
+++ b/highflip-core/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- com.baidu
+ com.baidu.highflip
highflip-core
jar
1.0.0-SNAPSHOT
@@ -11,7 +11,7 @@
http://maven.apache.org
- com.baidu
+ com.baidu.highflip
highflip
1.0.0-SNAPSHOT
../pom.xml
@@ -19,7 +19,7 @@
- com.baidu
+ com.baidu.highflip
highflip-proto
1.0.0-SNAPSHOT
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/adaptor/ServiceAdaptor.java b/highflip-core/src/main/java/com/baidu/highflip/core/adaptor/ServiceAdaptor.java
new file mode 100644
index 0000000..104cfc1
--- /dev/null
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/adaptor/ServiceAdaptor.java
@@ -0,0 +1,10 @@
+package com.baidu.highflip.core.adaptor;
+
+public interface ServiceAdaptor {
+
+ String getUrl();
+
+ String getPartyId();
+
+ String getRole();
+}
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/common/AdaptorPropsList.java b/highflip-core/src/main/java/com/baidu/highflip/core/common/AdaptorPropsList.java
index 70522ff..f156486 100644
--- a/highflip-core/src/main/java/com/baidu/highflip/core/common/AdaptorPropsList.java
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/common/AdaptorPropsList.java
@@ -25,4 +25,16 @@ public class AdaptorPropsList {
public static final String PROPS_HIGHFLIP_ADAPTOR_PLATFORM_VERSION_DEFAULT = "0.0.0";
+ public static final String PROPS_HIGHFLIP_ADAPTOR_SERVICE_URL = "highflip.adaptor.service.url";
+
+ public static final String PROPS_HIGHFLIP_ADAPTOR_SERVICE_URL_DEFAULT = "http://127.0.0.1:9380";
+
+ public static final String PROPS_HIGHFLIP_ADAPTOR_SERVICE_PARTY_ID = "highflip.adaptor.service.party.id";
+
+ public static final String PROPS_HIGHFLIP_ADAPTOR_SERVICE_PARTY_ID_DEFAULT = "9999";
+
+ public static final String PROPS_HIGHFLIP_ADAPTOR_SERVICE_ROLE = "highflip.adaptor.service.role";
+
+ public static final String PROPS_HIGHFLIP_ADAPTOR_SERVICE_ROLE_DEFAULT = "guest";
+
}
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/common/InstanceNameList.java b/highflip-core/src/main/java/com/baidu/highflip/core/common/InstanceNameList.java
index ef166ec..1a34c7f 100644
--- a/highflip-core/src/main/java/com/baidu/highflip/core/common/InstanceNameList.java
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/common/InstanceNameList.java
@@ -25,4 +25,7 @@ public class InstanceNameList {
public static final String HIGHFLIP_ADAPTOR_PARTNER = "highflip.adaptor.partner";
public static final String HIGHFLIP_ADAPTOR_USER = "highflip.adaptor.user";
+
+ public static final String HIGHFLIP_ADAPTOR_SERVICE = "highflip.adaptor.service";
+
}
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/engine/HighFlipRuntime.java b/highflip-core/src/main/java/com/baidu/highflip/core/engine/HighFlipRuntime.java
index 26f069a..21a56a6 100644
--- a/highflip-core/src/main/java/com/baidu/highflip/core/engine/HighFlipRuntime.java
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/engine/HighFlipRuntime.java
@@ -6,6 +6,7 @@
import com.baidu.highflip.core.entity.runtime.Partner;
import com.baidu.highflip.core.entity.runtime.Task;
import com.baidu.highflip.core.entity.runtime.User;
+import com.baidu.highflip.core.entity.runtime.basic.Status;
public interface HighFlipRuntime {
@@ -26,4 +27,10 @@ public interface HighFlipRuntime {
User getUser(String userId);
Operator getOperator(String operatorId);
+
+ Data registerData(Data data);
+
+ Iterable listTask(String jobId);
+
+ void updateTask(Task task);
}
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Graph.java b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Graph.java
index 2224ee4..73eacfe 100644
--- a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Graph.java
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Graph.java
@@ -3,6 +3,8 @@
import com.baidu.highflip.core.entity.dag.codec.AttributeMap;
import com.baidu.highflip.core.entity.dag.common.NamedAttributeObject;
import com.baidu.highflip.core.utils.ProtoUtils;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
import highflip.HighflipMeta;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -96,7 +98,7 @@ public Iterable listParties() {
return getParties().keySet();
}
-
+ @JsonIgnore
protected void setNodeCategory() {
calcMiddleNodes();
calcOutputNodes();
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Node.java b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Node.java
index 2089128..78d73c0 100644
--- a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Node.java
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Node.java
@@ -6,16 +6,19 @@
import com.baidu.highflip.core.entity.dag.common.NodeInputRef;
import com.baidu.highflip.core.entity.dag.common.NodeOutputRef;
import com.baidu.highflip.core.utils.ProtoUtils;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
import highflip.HighflipMeta;
import lombok.Data;
-import javax.persistence.Transient;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
+import org.springframework.data.annotation.Transient;
+
@Data
public class Node extends NamedAttributeObject implements Serializable {
@@ -25,7 +28,7 @@ public class Node extends NamedAttributeObject implements Serializable {
String description;
- @Transient
+ @JsonIgnore
Graph graph;
Category category;
@@ -108,6 +111,7 @@ public Node getInputNode(String name) {
getInputs().get(name).getFromNode());
}
+ @JsonIgnore
public List getInputNodes() {
return getInputs()
.values()
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Party.java b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Party.java
index c96e552..5d096f0 100644
--- a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Party.java
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/Party.java
@@ -3,6 +3,7 @@
import com.baidu.highflip.core.entity.dag.codec.AttributeMap;
import com.baidu.highflip.core.entity.dag.common.NamedAttributeObject;
import com.baidu.highflip.core.utils.ProtoUtils;
+
import highflip.HighflipMeta;
import lombok.Data;
diff --git a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/codec/TypeValue.java b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/codec/TypeValue.java
index b5227f4..1a43401 100644
--- a/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/codec/TypeValue.java
+++ b/highflip-core/src/main/java/com/baidu/highflip/core/entity/dag/codec/TypeValue.java
@@ -1,5 +1,12 @@
package com.baidu.highflip.core.entity.dag.codec;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.google.protobuf.ByteString;
+
import highflip.HighflipMeta;
public class TypeValue {
@@ -17,11 +24,76 @@ public static Object fromProto(HighflipMeta.TypedValueProto value) {
return value.getValue().getFloat();
} else if (typeValue == HighflipMeta.TypedValueProto.TypeProto.STRING.getNumber()) {
return value.getValue().getString();
+ } else if (typeValue == HighflipMeta.TypedValueProto.TypeProto.BYTES.getNumber()) {
+ return value.getValue().getBytes();
+ } else if (typeValue == HighflipMeta.TypedValueProto.TypeProto.LIST.getNumber()) {
+ return listProtoConvert2List(value.getValue().getList());
+ } else if (typeValue == HighflipMeta.TypedValueProto.TypeProto.MAP.getNumber()) {
+ return mapProtoConvert2Map(value.getValue().getMap());
} else {
throw new IllegalArgumentException();
}
}
+ private static List
+
+
+ ossrh
+ Central Repository OSSRH
+ https://oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
+ ossrh
+ Central Repository OSSRH
+ https://oss.sonatype.org/content/repositories/snapshots
+
+
+
io.grpc
diff --git a/highflip-proto/src/main/proto/highflip-meta.proto b/highflip-proto/src/main/proto/highflip-meta.proto
index a093630..a11552c 100644
--- a/highflip-proto/src/main/proto/highflip-meta.proto
+++ b/highflip-proto/src/main/proto/highflip-meta.proto
@@ -65,6 +65,8 @@ message NodeInputProto{
string from_node = 4;
string from_output = 5;
+
+ string value = 6;
}
message NodeOutputProto{
@@ -74,6 +76,8 @@ message NodeOutputProto{
string name = 2;
optional string description = 3;
+
+ string value = 4;
}
message NodeProto{
diff --git a/highflip-proto/src/main/proto/highflip.proto b/highflip-proto/src/main/proto/highflip.proto
index 880a5b6..9549533 100644
--- a/highflip-proto/src/main/proto/highflip.proto
+++ b/highflip-proto/src/main/proto/highflip.proto
@@ -230,6 +230,8 @@ message TaskGetResponse{
repeated string input_tasks = 9;
repeated string output_tasks = 10;
+
+ repeated string output_data_ids = 11;
}
@@ -559,7 +561,6 @@ message ConfigListResponse{
string key = 1;
}
-
////////////////////////////////////////////////////////////////////////////////
// SERVICE
////////////////////////////////////////////////////////////////////////////////
diff --git a/highflip-server/pom.xml b/highflip-server/pom.xml
index 5055c3e..104b332 100644
--- a/highflip-server/pom.xml
+++ b/highflip-server/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- com.baidu
+ com.baidu.highflip
highflip-server
jar
1.0.0-SNAPSHOT
@@ -11,7 +11,7 @@
http://maven.apache.org
- com.baidu
+ com.baidu.highflip
highflip
1.0.0-SNAPSHOT
../pom.xml
@@ -70,7 +70,7 @@
- com.baidu
+ com.baidu.highflip
highflip-core
1.0.0-SNAPSHOT
diff --git a/highflip-server/src/main/java/com/baidu/highflip/server/adaptor/DefaultAdaptor.java b/highflip-server/src/main/java/com/baidu/highflip/server/adaptor/DefaultAdaptor.java
index a9fdf38..e183cd5 100644
--- a/highflip-server/src/main/java/com/baidu/highflip/server/adaptor/DefaultAdaptor.java
+++ b/highflip-server/src/main/java/com/baidu/highflip/server/adaptor/DefaultAdaptor.java
@@ -2,10 +2,12 @@
import com.baidu.highflip.core.common.InstanceNameList;
import com.baidu.highflip.core.engine.HighFlipAdaptor;
+import com.baidu.highflip.core.engine.HighFlipRuntime;
import com.baidu.highflip.core.engine.InstanceRegister;
import com.baidu.highflip.server.adaptor.impl.ConfigurableOperatorAdaptor;
import com.baidu.highflip.server.adaptor.impl.ConfigurablePartnerAdaptor;
import com.baidu.highflip.server.adaptor.impl.ConfigurablePlatformAdaptor;
+import com.baidu.highflip.server.adaptor.impl.ConfigurableServiceAdaptor;
import com.baidu.highflip.server.adaptor.impl.DumbJobAdaptor;
import com.baidu.highflip.server.adaptor.impl.DumbTaskAdaptor;
import com.baidu.highflip.server.adaptor.impl.FixedSingleDataAdaptor;
@@ -22,6 +24,17 @@ public class DefaultAdaptor implements HighFlipAdaptor {
public static final String PLATFORM_PROPERTIES = "/adaptor/highflip.platform.properties";
+ /**
+ * 用于配置本侧服务的配置信息
+ */
+ public static final String SERVICE_PROPERTIES = "/adaptor/highflip.service.properties";
+
+ private HighFlipRuntime highFlipRuntime;
+
+ public DefaultAdaptor(HighFlipRuntime highFlipRuntime) {
+ this.highFlipRuntime = highFlipRuntime;
+ }
+
@Override
public void setup(InstanceRegister register) {
register.register(InstanceNameList.HIGHFLIP_ADAPTOR_JOB, new DumbJobAdaptor());
@@ -37,6 +50,20 @@ public void setup(InstanceRegister register) {
register.register(InstanceNameList.HIGHFLIP_ADAPTOR_PLATFORM,
new ConfigurablePlatformAdaptor(HighFlipUtils.getProperty(PLATFORM_PROPERTIES)));
+
+ final ConfigurableServiceAdaptor configurableServiceAdaptor =
+ new ConfigurableServiceAdaptor(
+ HighFlipUtils.getProperty(SERVICE_PROPERTIES));
+ register.register(InstanceNameList.HIGHFLIP_ADAPTOR_SERVICE, configurableServiceAdaptor);
+
+ highFlipRuntime.getConfiguration().setString("highflip.adaptor.service.url",
+ configurableServiceAdaptor.getUrl());
+ highFlipRuntime.getConfiguration().setString("highflip.adaptor.service.party.id",
+ configurableServiceAdaptor.getPartyId());
+ highFlipRuntime.getConfiguration().setString("highflip.adaptor.service.role",
+ configurableServiceAdaptor.getRole());
+
+ register.register(InstanceNameList.HIGHFLIP_RUNTIME, highFlipRuntime);
}
@Override
diff --git a/highflip-server/src/main/java/com/baidu/highflip/server/adaptor/impl/ConfigurableServiceAdaptor.java b/highflip-server/src/main/java/com/baidu/highflip/server/adaptor/impl/ConfigurableServiceAdaptor.java
new file mode 100644
index 0000000..800bbc8
--- /dev/null
+++ b/highflip-server/src/main/java/com/baidu/highflip/server/adaptor/impl/ConfigurableServiceAdaptor.java
@@ -0,0 +1,42 @@
+package com.baidu.highflip.server.adaptor.impl;
+
+import java.util.Properties;
+
+import com.baidu.highflip.core.adaptor.ServiceAdaptor;
+import com.baidu.highflip.core.common.AdaptorPropsList;
+
+public class ConfigurableServiceAdaptor implements ServiceAdaptor {
+
+ String url;
+
+ String partyId;
+
+ String role;
+
+ public ConfigurableServiceAdaptor(Properties props) {
+
+ this.url = props.getProperty(AdaptorPropsList.PROPS_HIGHFLIP_ADAPTOR_SERVICE_URL,
+ AdaptorPropsList.PROPS_HIGHFLIP_ADAPTOR_SERVICE_URL_DEFAULT);
+
+ this.partyId = props.getProperty(AdaptorPropsList.PROPS_HIGHFLIP_ADAPTOR_SERVICE_PARTY_ID,
+ AdaptorPropsList.PROPS_HIGHFLIP_ADAPTOR_SERVICE_PARTY_ID_DEFAULT);
+
+ this.role = props.getProperty(AdaptorPropsList.PROPS_HIGHFLIP_ADAPTOR_SERVICE_ROLE,
+ AdaptorPropsList.PROPS_HIGHFLIP_ADAPTOR_SERVICE_ROLE_DEFAULT);
+ }
+
+ @Override
+ public String getUrl() {
+ return this.url;
+ }
+
+ @Override
+ public String getPartyId() {
+ return this.partyId;
+ }
+
+ @Override
+ public String getRole() {
+ return this.role;
+ }
+}
diff --git a/highflip-server/src/main/java/com/baidu/highflip/server/config/AdaptorConfig.java b/highflip-server/src/main/java/com/baidu/highflip/server/config/AdaptorConfig.java
index 0c99b7e..2a7827d 100644
--- a/highflip-server/src/main/java/com/baidu/highflip/server/config/AdaptorConfig.java
+++ b/highflip-server/src/main/java/com/baidu/highflip/server/config/AdaptorConfig.java
@@ -3,6 +3,8 @@
import com.baidu.highflip.core.engine.InstanceRegister;
import com.baidu.highflip.server.adaptor.DefaultAdaptor;
import com.baidu.highflip.server.adaptor.loader.AdaptorLoader;
+import com.baidu.highflip.server.engine.component.HighFlipRuntime;
+
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -23,6 +25,9 @@ public class AdaptorConfig {
@Autowired
InstanceRegister register;
+ @Autowired
+ HighFlipRuntime highFlipRuntime;
+
AdaptorLoader loader = null;
@PostConstruct
@@ -71,7 +76,7 @@ void initialAdaptor() {
}
void initialDefaultAdaptor() {
- DefaultAdaptor adaptor = new DefaultAdaptor();
+ DefaultAdaptor adaptor = new DefaultAdaptor(highFlipRuntime);
adaptor.setup(register);
}
}
diff --git a/highflip-server/src/main/java/com/baidu/highflip/server/engine/HighFlipEngine.java b/highflip-server/src/main/java/com/baidu/highflip/server/engine/HighFlipEngine.java
index 525db92..05443c3 100644
--- a/highflip-server/src/main/java/com/baidu/highflip/server/engine/HighFlipEngine.java
+++ b/highflip-server/src/main/java/com/baidu/highflip/server/engine/HighFlipEngine.java
@@ -45,6 +45,7 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
@@ -64,7 +65,7 @@ public class HighFlipEngine {
@Autowired
PlatformTransactionManager transactionManager;
- ConcurrentMap activeJobs;
+ ConcurrentMap activeJobs = new ConcurrentHashMap<>();
@Autowired
AsyncTaskExecutor executor;
@@ -290,7 +291,6 @@ public Job createJob(String name, String description, Graph graph) {
job = getContext().getJobAdaptor()
.createJob(job);
-
job = getContext().getJobRepository()
.save(job);
@@ -314,12 +314,12 @@ public Job createJob(String name, String description, Graph graph) {
getContext().getTaskRepository()
.saveAll(news);
}
+ activeJobs.putIfAbsent(job.getJobId(), job);
return job;
}
-
// @Scheduled
- protected void updateJob() {
+ public void updateJob() {
JobAdaptor adaptor = getContext().getJobAdaptor();
@@ -328,6 +328,10 @@ protected void updateJob() {
if (status != job.getStatus()) {
job.setStatus(status);
getContext().getJobRepository().save(job);
+ getContext().getJobAdaptor().updateJob(job);
+ }
+ if (status == Status.SUCCEEDED || status == Status.FAILED) {
+ activeJobs.remove(job.getJobId());
}
});
}
@@ -413,14 +417,15 @@ public void initializeTasks() {
}
// @Scheduled
- private void updateTask() {
-
+ public void updateTask(Task task) {
+ getContext().getTaskRepository().save(task);
}
public Iterable listTask(String jobid) {
-
- return getContext().getTaskRepository()
- .findAllByJobid(jobid);
+ final List tasks = getContext().getTaskRepository()
+ .findAllByJobid(jobid);
+ log.info("tasks size: {}", tasks.size());
+ return tasks;
}
@Cacheable(value = "tasks")
diff --git a/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipContext.java b/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipContext.java
index d204511..3d2a07b 100644
--- a/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipContext.java
+++ b/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipContext.java
@@ -5,6 +5,7 @@
import com.baidu.highflip.core.adaptor.OperatorAdaptor;
import com.baidu.highflip.core.adaptor.PartnerAdaptor;
import com.baidu.highflip.core.adaptor.PlatformAdaptor;
+import com.baidu.highflip.core.adaptor.ServiceAdaptor;
import com.baidu.highflip.core.adaptor.TaskAdaptor;
import com.baidu.highflip.core.adaptor.UserAdaptor;
import com.baidu.highflip.core.common.InstanceNameList;
@@ -125,4 +126,9 @@ public UserAdaptor getUserAdaptor(){
public UserRepository getUserRepository() {
return userReps;
}
+
+ // SERVICE
+ public ServiceAdaptor getServiceAdaptor() {
+ return getInstance(InstanceNameList.HIGHFLIP_ADAPTOR_SERVICE);
+ }
}
diff --git a/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipRuntime.java b/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipRuntime.java
index 55c0412..791cce8 100644
--- a/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipRuntime.java
+++ b/highflip-server/src/main/java/com/baidu/highflip/server/engine/component/HighFlipRuntime.java
@@ -7,6 +7,8 @@
import com.baidu.highflip.core.entity.runtime.Partner;
import com.baidu.highflip.core.entity.runtime.Task;
import com.baidu.highflip.core.entity.runtime.User;
+import com.baidu.highflip.core.entity.runtime.basic.Status;
+
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -18,13 +20,16 @@ public class HighFlipRuntime implements com.baidu.highflip.core.engine.HighFlipR
@Autowired
HighFlipContext context;
+ @Autowired
+ HighFlipConfiguration configuration;
+
HighFlipContext getContext() {
return context;
}
@Override
public Configuration getConfiguration() {
- return null;
+ return configuration;
}
@Override
@@ -69,4 +74,21 @@ public User getUser(String userId) {
public Operator getOperator(String operatorId) {
return null;
}
+
+ @Override
+ public Data registerData(Data data) {
+ Data dataSaved = getContext().getDataRepository().save(data);
+ return dataSaved;
+ }
+
+ @Override
+ public Iterable listTask(String jobId) {
+ return getContext().getTaskRepository()
+ .findAllByJobid(jobId);
+ }
+
+ @Override
+ public void updateTask(Task task) {
+ getContext().getTaskRepository().save(task);
+ }
}
diff --git a/highflip-server/src/main/java/com/baidu/highflip/server/rpc/v1/HighFlipRpcService.java b/highflip-server/src/main/java/com/baidu/highflip/server/rpc/v1/HighFlipRpcService.java
index aaa80e2..050051a 100644
--- a/highflip-server/src/main/java/com/baidu/highflip/server/rpc/v1/HighFlipRpcService.java
+++ b/highflip-server/src/main/java/com/baidu/highflip/server/rpc/v1/HighFlipRpcService.java
@@ -1,5 +1,6 @@
package com.baidu.highflip.server.rpc.v1;
+import com.baidu.highflip.core.adaptor.ServiceAdaptor;
import com.baidu.highflip.core.entity.dag.Graph;
import com.baidu.highflip.core.entity.runtime.Config;
import com.baidu.highflip.core.entity.runtime.Data;
@@ -84,6 +85,7 @@ public void listConfig(Highflip.ConfigListRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void getConfig(Highflip.ConfigId request,
StreamObserver responseObserver) {
@@ -105,6 +107,7 @@ public void getConfig(Highflip.ConfigId request,
* @param request
* @param responseObserver
*/
+ @Override
public void setConfig(Highflip.ConfigSetRequest request,
StreamObserver responseObserver) {
@@ -113,6 +116,7 @@ public void setConfig(Highflip.ConfigSetRequest request,
returnVoid(responseObserver);
}
+ @Override
public void deleteConfig(Highflip.ConfigId request,
StreamObserver responseObserver) {
@@ -129,6 +133,7 @@ public void deleteConfig(Highflip.ConfigId request,
* @param request
* @param responseObserver
*/
+ @Override
public void getPlatform(Highflip.Void request,
StreamObserver responseObserver) {
@@ -147,6 +152,7 @@ public void getPlatform(Highflip.Void request,
* @param request
* @param responseObserver
*/
+ @Override
public void matchPlatform(Highflip.PlatformMatchRequest request,
StreamObserver responseObserver) {
@@ -189,6 +195,7 @@ public void createJob(Highflip.JobCreateRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void getJob(Highflip.JobId request,
StreamObserver responseObserver) {
Job job = getEngine().getJob(request.getJobId());
@@ -210,16 +217,24 @@ public void getJob(Highflip.JobId request,
* @param request
* @param responseObserver
*/
+ @Override
public void checkJob(Highflip.JobId request,
StreamObserver responseObserver) {
Job job = getEngine().getJob(request.getJobId());
+ com.baidu.highflip.core.entity.runtime.basic.Status jobStatus =
+ getEngine().getContext()
+ .getJobAdaptor()
+ .getJobStatus(job);
+ // check and update job
+ getEngine().updateJob();
Highflip.JobCheckResponse response = Highflip.JobCheckResponse
.newBuilder()
.setJobId(job.getJobId())
+ .setStatus(Highflip.JobCheckResponse.JobStatus.valueOf(
+ jobStatus.toString().toUpperCase()))
.build();
-
returnOne(responseObserver, response);
}
@@ -227,6 +242,7 @@ public void checkJob(Highflip.JobId request,
* @param request
* @param responseObserver
*/
+ @Override
public void deleteJob(Highflip.JobId request,
StreamObserver responseObserver) {
@@ -239,6 +255,7 @@ public void deleteJob(Highflip.JobId request,
* @param request
* @param responseObserver
*/
+ @Override
public void listJob(Highflip.JobListRequest request,
StreamObserver responseObserver) {
@@ -259,6 +276,7 @@ public void listJob(Highflip.JobListRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void controlJob(Highflip.JobControlRequest request,
StreamObserver responseObserver) {
@@ -270,6 +288,7 @@ public void controlJob(Highflip.JobControlRequest request,
returnVoid(responseObserver);
}
+ @Override
public void getJobLog(Highflip.JobLogRequest request,
StreamObserver responseObserver) {
@@ -282,9 +301,12 @@ public void getJobLog(Highflip.JobLogRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void listTask(Highflip.TaskListRequest request,
StreamObserver responseObserver) {
-
+ final Job job = getEngine().getJob(request.getJobId());
+ log.info("job id: {}, job binging id: {}", job.getJobId(),
+ job.getBingingId());
Iterator response = Streams
.stream(getEngine().listTask(request.getJobId()))
.map(t -> Highflip.TaskListResponse
@@ -300,6 +322,7 @@ public void listTask(Highflip.TaskListRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void getTask(Highflip.TaskId request,
StreamObserver responseObserver) {
@@ -309,8 +332,10 @@ public void getTask(Highflip.TaskId request,
.newBuilder()
.setTaskId(task.getTaskid())
.setJobId(task.getJobid())
+ .setNodeName(task.getNodeName())
.setCreateTime(task.getCreateTime().toString())
.setUpdateTime(task.getUpdateTime().toString())
+ .addAllOutputDataIds(task.getOutputData())
.build();
returnOne(responseObserver, response);
@@ -320,6 +345,7 @@ public void getTask(Highflip.TaskId request,
* @param request
* @param responseObserver
*/
+ @Override
public void checkTask(Highflip.TaskId request,
StreamObserver responseObserver) {
@@ -340,6 +366,7 @@ public void checkTask(Highflip.TaskId request,
* @param request
* @param responseObserver
*/
+ @Override
public void controlTask(Highflip.TaskControlRequest request,
StreamObserver responseObserver) {
@@ -355,6 +382,7 @@ public void controlTask(Highflip.TaskControlRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void getTaskLog(Highflip.TaskLogRequest request,
StreamObserver responseObserver) {
@@ -368,6 +396,7 @@ public void getTaskLog(Highflip.TaskLogRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void listData(Highflip.DataListRequest request,
StreamObserver responseObserver) {
@@ -383,6 +412,7 @@ public void listData(Highflip.DataListRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void getData(Highflip.DataId request,
StreamObserver responseObserver) {
@@ -413,6 +443,7 @@ public void getData(Highflip.DataId request,
* @param responseObserver
* @return
*/
+ @Override
public StreamObserver pushData(
StreamObserver responseObserver) {
@@ -496,6 +527,7 @@ public void onCompleted() {
* @param request
* @param responseObserver
*/
+ @Override
public void pullData(Highflip.DataPullRequest request,
StreamObserver responseObserver) {
@@ -537,6 +569,7 @@ public void pullData(Highflip.DataPullRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void deleteData(Highflip.DataId request,
StreamObserver responseObserver) {
@@ -552,6 +585,7 @@ public void deleteData(Highflip.DataId request,
* @param request
* @param responseObserver
*/
+ @Override
public void listOperator(Highflip.OperatorListRequest request,
StreamObserver responseObserver) {
Iterator response = Streams
@@ -569,6 +603,7 @@ public void listOperator(Highflip.OperatorListRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void getOperator(Highflip.OperatorId request,
StreamObserver responseObserver) {
@@ -594,6 +629,7 @@ public void getOperator(Highflip.OperatorId request,
* @param request
* @param responseObserver
*/
+ @Override
public void createPartner(Highflip.PartnerCreateRequest request,
StreamObserver responseObserver) {
@@ -614,6 +650,7 @@ public void createPartner(Highflip.PartnerCreateRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void getPartner(Highflip.PartnerId request,
StreamObserver responseObserver) {
@@ -635,6 +672,7 @@ public void getPartner(Highflip.PartnerId request,
* @param request
* @param responseObserver
*/
+ @Override
public void listPartner(Highflip.PartnerListRequest request,
StreamObserver responseObserver) {
@@ -653,9 +691,9 @@ public void listPartner(Highflip.PartnerListRequest request,
* @param request
* @param responseObserver
*/
+ @Override
public void controlPartner(Highflip.PartnerControlRequest request,
StreamObserver responseObserver) {
}
-
}
diff --git a/highflip-server/src/main/resources/adaptor/highflip.service.properties b/highflip-server/src/main/resources/adaptor/highflip.service.properties
new file mode 100644
index 0000000..b36b940
--- /dev/null
+++ b/highflip-server/src/main/resources/adaptor/highflip.service.properties
@@ -0,0 +1,3 @@
+highflip.adaptor.service.url=http://10.27.130.41:8380
+highflip.adaptor.service.party.id=9999
+highflip.adaptor.service.role=guest
\ No newline at end of file
diff --git a/highflip-server/src/main/resources/application.properties b/highflip-server/src/main/resources/application.properties
index e7c6ac5..deced10 100644
--- a/highflip-server/src/main/resources/application.properties
+++ b/highflip-server/src/main/resources/application.properties
@@ -30,7 +30,9 @@ spring.jpa.properties.jadira.usertype.autoRegisterUserTypes=true
# h2
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.datasource.driver-class-name=org.h2.Driver
-spring.datasource.url=jdbc:h2:file:~/.highflip/db/highflip.db
+spring.datasource.url=jdbc:h2:file:~/.highflip/db/highflip
+spring.datasource.username=highflip
+spring.datasource.password=changeMe
#########################################################
# logging
#########################################################
diff --git a/highflip-server/src/test/java/com/baidu/highflip/server/engine/HighFlipEngineTest.java b/highflip-server/src/test/java/com/baidu/highflip/server/engine/HighFlipEngineTest.java
new file mode 100644
index 0000000..d4651d8
--- /dev/null
+++ b/highflip-server/src/test/java/com/baidu/highflip/server/engine/HighFlipEngineTest.java
@@ -0,0 +1,5 @@
+package com.baidu.highflip.server.engine;
+
+public class HighFlipEngineTest {
+
+}
diff --git a/highflip-vendors/highflip-adaptor-demo/pom.xml b/highflip-vendors/highflip-adaptor-demo/pom.xml
index a022666..871c819 100644
--- a/highflip-vendors/highflip-adaptor-demo/pom.xml
+++ b/highflip-vendors/highflip-adaptor-demo/pom.xml
@@ -3,7 +3,7 @@
4.0.0
- com.baidu
+ com.baidu.highflip
highflip-adaptor-demo
jar
1.0.0-SNAPSHOT
@@ -18,7 +18,7 @@
- com.baidu
+ com.baidu.highflip
highflip-core
1.0.0-SNAPSHOT
compile
diff --git a/highflip-vendors/highflip-adaptor-fate/pom.xml b/highflip-vendors/highflip-adaptor-fate/pom.xml
index 481c757..c6622a8 100644
--- a/highflip-vendors/highflip-adaptor-fate/pom.xml
+++ b/highflip-vendors/highflip-adaptor-fate/pom.xml
@@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
- com.baidu
+ com.baidu.highflip
highflip-adaptor-fate
jar
1.0.0-SNAPSHOT
@@ -17,6 +17,16 @@
+
+ com.baidu.highflip
+ highflip-proto
+ 1.0.0-SNAPSHOT
+
+
+ com.baidu.highflip
+ highflip-core
+ 1.0.0-SNAPSHOT
+
org.junit.jupiter
junit-jupiter
@@ -30,21 +40,42 @@
test
- com.baidu
- highflip-core
- 1.0.0-SNAPSHOT
- compile
+ com.google.protobuf
+ protobuf-java
+ 3.21.1
io.github.openfeign
feign-core
11.10
+
+ org.slf4j
+ slf4j-api
+ 1.7.36
+
+
+
+ org.slf4j
+ slf4j-simple
+ 1.7.36
+
io.github.openfeign
feign-jackson
11.10
+
+ io.github.openfeign
+ feign-httpclient
+ 11.10
+
+
+
+ org.apache.commons
+ commons-compress
+ 1.21
+
@@ -54,6 +85,25 @@
maven-surefire-plugin
2.22.2
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.3.0
+
+
+ jar-with-dependencies
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/DataAdaptor.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/DataAdaptor.java
index 52b367f..45952eb 100644
--- a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/DataAdaptor.java
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/DataAdaptor.java
@@ -1,10 +1,167 @@
package com.webank.ai.fate.adaptor;
+import static com.webank.ai.fate.common.FateConstants.DATA_ID_SEPARATOR;
+
+import com.baidu.highflip.core.entity.runtime.Data;
+import com.baidu.highflip.core.entity.runtime.basic.DataCategory;
+import com.baidu.highflip.core.entity.runtime.basic.KeyPair;
+import com.baidu.highflip.core.utils.Foreach;
+import com.webank.ai.fate.client.form.ResultForm;
+import com.webank.ai.fate.common.DataMultipartFile;
+import com.webank.ai.fate.common.DecompressUtils;
import com.webank.ai.fate.context.FateContext;
+import feign.Response;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Getter
+public class DataAdaptor implements com.baidu.highflip.core.adaptor.DataAdaptor {
-public class DataAdaptor {
+ private final FateContext context;
+
+ private final String DEFAULT_NAMESPACES = "HIGH-FLIP";
+
+ private final String DEFAULT_DELIMITER = ",";
public DataAdaptor(FateContext context) {
+ this.context = context;
+ }
+
+ @Override
+ public Data updateData(Data data) {
+ return null;
+ }
+
+ @Override
+ public int getDataCount() {
+ return 0;
+ }
+
+ @Override
+ public Data getDataByIndex(int index, Data data) {
+ return null;
+ }
+
+ @Override
+ public void deleteData(Data data) {
+ getContext().getClient().deleteData(data.getBingingId(), DEFAULT_NAMESPACES);
+ }
+
+ @Override
+ public InputStream readDataRaw(Data data) {
+ return null;
+ }
+
+ @Override
+ public Iterator> readDataDense(Data data) {
+ if(data == null) {
+ throw new RuntimeException("data is null.");
+ }
+ log.info("data:{}", data);
+
+ if (DataCategory.RESULT_DATA.equals(data.getCategory())) {
+ String jobId = (String) data.getBinding().get("jobId");
+ String componentName = (String) data.getBinding().get("componentName");
+ String role = (String) data.getBinding().get("role");
+ String partyId = (String) data.getBinding().get("partyId");
+ log.info("jobId: {}, componentName: {}, role: {}, partyId: {}",
+ jobId, componentName, role, partyId);
+
+ try (Response response = getContext().getClient()
+ .downloadComponentResultData(jobId, componentName,
+ role, partyId)) {
+ String content = DecompressUtils.decompressTarGzToStringMap(
+ response.body().asInputStream(),
+ s -> s.contains("csv")).get("data.csv");
+ return Arrays.stream(content.split("\n"))
+ .map(s -> Arrays.stream(s.split(DEFAULT_DELIMITER))
+ .map(d -> (Object) d)
+ .collect(Collectors.toList()))
+ .collect(Collectors.toList()).iterator();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ } else {
+ try (Response response = getContext().getClient()
+ .downloadData(data.getName(),
+ DEFAULT_NAMESPACES)) {
+ String content = DecompressUtils.decompressTarGzToStringMap(
+ response.body().asInputStream(),
+ s -> s.contains("csv")).get("table.csv");
+ return Arrays.stream(content.split("\n"))
+ .map(s -> Arrays.stream(s.split(DEFAULT_DELIMITER))
+ .map(d -> (Object) d)
+ .collect(Collectors.toList()))
+ .collect(Collectors.toList()).iterator();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ @Override
+ public Iterator> readDataSparse(Data data) {
+ return null;
+ }
+
+ @Override
+ public Data createData(Data data) {
+ return null;
+ }
+
+ @Override
+ public void writeDataRaw(Data data, InputStream body) {
+
+ }
+
+ @Override
+ public void writeDataDense(Data data, Iterator> body) {
+ StringBuilder stringBuilder = new StringBuilder();
+ try {
+ String headers =
+ data.getColumns().stream().map(c -> c.getName())
+ .collect(Collectors.joining(DEFAULT_DELIMITER));
+ stringBuilder.append(headers).append("\n");
+ final Foreach> foreach = Foreach.from(body);
+ for (List dataList : foreach) {
+ String column = dataList.stream().map(Object::toString).collect(
+ Collectors.joining(DEFAULT_DELIMITER));
+ stringBuilder.append(column).append("\n");
+ }
+ } catch (NoSuchElementException e) {
+ log.warn("body has no next element");
+ } catch (Exception e) {
+ throw e;
+ }
+ String tableName = data.getName();
+ log.info("push table:{} data:{}", tableName, data);
+
+ MultipartFile multipartFile = new DataMultipartFile(tableName,
+ stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
+ // drop default 1, which means overwrite the dataset
+ ResultForm dataResultForm =
+ getContext().getClient()
+ .pushData(multipartFile, DEFAULT_DELIMITER, "1",
+ "4", tableName, DEFAULT_NAMESPACES,
+ null, null,
+ null, "1");
+ data.setBingingId(dataResultForm.getData().getJob_id());
+ }
+
+ @Override
+ public void writeDataSparse(Data data, Iterator> body) {
}
}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/JobAdaptor.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/JobAdaptor.java
index 6fb2c7b..a8b992d 100644
--- a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/JobAdaptor.java
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/JobAdaptor.java
@@ -1,20 +1,29 @@
package com.webank.ai.fate.adaptor;
import com.baidu.highflip.core.engine.HighFlipRuntime;
-import com.baidu.highflip.core.entity.runtime.Job;
+import com.baidu.highflip.core.entity.runtime.Data;
import com.baidu.highflip.core.entity.runtime.Task;
import com.baidu.highflip.core.entity.runtime.basic.Action;
+import com.baidu.highflip.core.entity.runtime.basic.DataCategory;
+import com.baidu.highflip.core.entity.runtime.basic.DataMode;
import com.baidu.highflip.core.entity.runtime.basic.Status;
-import com.webank.ai.fate.client.form.JobQueryResponseForm;
import com.webank.ai.fate.client.form.ResultForm;
+import com.webank.ai.fate.client.form.job.FateJob;
+import com.webank.ai.fate.client.form.job.QueryJob;
+import com.webank.ai.fate.client.form.task.FFateTask;
+import com.webank.ai.fate.client.form.task.FateTask;
import com.webank.ai.fate.context.FateContext;
import com.webank.ai.fate.translator.DSLTranslator;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.CollectionUtils;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
+import java.util.stream.Collectors;
@Slf4j
@Getter
@@ -28,11 +37,11 @@ public JobAdaptor(FateContext context) {
@Override
public List getFeatures() {
- return null;
+ throw new UnsupportedOperationException();
}
@Override
- public Job createJob(Job job) {
+ public com.baidu.highflip.core.entity.runtime.Job createJob(com.baidu.highflip.core.entity.runtime.Job job) {
DSLTranslator.FateDAG dag = getContext()
.getTranslator()
@@ -40,83 +49,153 @@ public Job createJob(Job job) {
String bindId = getContext()
.getClient()
- .jobSumbit(dag.getDsl(), dag.getDsl());
+ .jobSubmit(dag.getDsl(), dag.getConf()).getData().getJob_id();
job.setBingingId(bindId);
return job;
}
@Override
- public Job updateJob(Job job) {
- return null;
+ public com.baidu.highflip.core.entity.runtime.Job updateJob(com.baidu.highflip.core.entity.runtime.Job job) {
+
+ String bindId = job.getJobId();
+ final Iterable tasks =
+ getContext().getHighFlipRuntime().listTask(bindId);
+ for (Task task : tasks) {
+ ResultForm> result =
+ getContext().getClient().taskQuery(task.getBingingId());
+ if (CollectionUtils.isEmpty(result.getData())) {
+ throw new RuntimeException("task not found, task: " + task);
+ }
+ final FFateTask fFateTask = result.getData().get(0);
+ final String f_status = fFateTask.getF_status();
+ final Status taskStatus = convertToHighFlipStatus(f_status);
+
+ if (task.getStatus().equals(taskStatus)) {
+ // task status has not changed
+ continue;
+ }
+
+ if (taskStatus == Status.SUCCEEDED) {
+ // register data and bind to task
+ Data data = new Data();
+ data.setBinding(Map.of("jobId", job.getBingingId(),
+ "taskId", task.getTaskid(),
+ "taskBingingId", task.getBingingId(),
+ "componentName", task.getName(),
+ "role",fFateTask.getF_role(),
+ "partyId",fFateTask.getF_party_id()));
+ data.setFormat(DataMode.DENSE);
+ data.setCategory(DataCategory.RESULT_DATA);
+ getContext().getHighFlipRuntime().registerData(data);
+ log.info("data: {}", data);
+ task.setOutputData(List.of(data.getDataId()));
+ }
+ task.setStatus(taskStatus.name());
+ getContext().getHighFlipRuntime().updateTask(task);
+ }
+ return job;
+ }
+
+ private Status convertToHighFlipStatus(String fateStatus) {
+ switch (fateStatus) {
+ case "success":
+ return Status.SUCCEEDED;
+ case "timeout":
+ return Status.FAILED;
+ case "failed":
+ return Status.FAILED;
+ default:
+ return Status.UNKNOWN;
+ }
}
@Override
- public boolean hasJob(Job job) {
- return false;
+ public boolean hasJob(com.baidu.highflip.core.entity.runtime.Job job) {
+ throw new UnsupportedOperationException();
}
@Override
- public Status getJobStatus(Job job) {
+ public Status getJobStatus(com.baidu.highflip.core.entity.runtime.Job job) {
String bindId = job.getBingingId();
- ResultForm> result = getContext()
+ ResultForm> result = getContext()
.getClient()
.jobQuery(bindId);
String status = result.getData()
.get(0)
- .getStatus();
+ .getF_status();
- return Status.valueOf(status);
+ if ("SUCCESS".equals(status.toUpperCase())) {
+ return Status.SUCCEEDED;
+ } else {
+ return Status.valueOf(status.toUpperCase());
+ }
}
@Override
- public void deleteJob(Job job) {
-
+ public void deleteJob(com.baidu.highflip.core.entity.runtime.Job job) {
+ throw new UnsupportedOperationException();
}
@Override
- public Job controlJob(Job job, Action action) {
+ public com.baidu.highflip.core.entity.runtime.Job controlJob(com.baidu.highflip.core.entity.runtime.Job job, Action action) {
switch (action) {
case STOP:
getContext().getClient().jobStop(job.getBingingId());
break;
+ default:
+ throw new UnsupportedOperationException();
}
return null;
}
@Override
public int getJobCount() {
- return 0;
+ log.info("client get job count");
+ return getContext().getClient().listJob(1, Integer.MAX_VALUE).getData().getCount();
}
@Override
- public Job getJobByIndex(int index, Job job) {
- return null;
+ public com.baidu.highflip.core.entity.runtime.Job getJobByIndex(int index, com.baidu.highflip.core.entity.runtime.Job job) {
+ log.info("client get job by index");
+ FateJob response = getContext().getClient().listJob(index + 1, 1).getData().getJobs().get(0);
+ return FateJob.convertToEntity(response);
}
@Override
- public Optional moreJob(Job job, HighFlipRuntime runtime) {
+ public Optional moreJob(com.baidu.highflip.core.entity.runtime.Job job, HighFlipRuntime runtime) {
return Optional.empty();
}
@Override
- public int getTaskCount(Job job) {
- return 0;
+ public int getTaskCount(com.baidu.highflip.core.entity.runtime.Job job) {
+ return getContext().getClient().listTask(job.getBingingId(), 1, Integer.MAX_VALUE).getData().getCount();
}
@Override
- public List getTaskList(Job job, List task) {
- return null;
+ public List getTaskList(com.baidu.highflip.core.entity.runtime.Job job, List tasks) {
+ List queryResult = getContext().getClient().listTask(job.getBingingId(), 1, Integer.MAX_VALUE).getData().getTasks().stream()
+ .map(FateTask::convertToEntity)
+ .collect(Collectors.toList());
+ for (int i = 0; i < tasks.size(); i++) {
+ Task queryTask = queryResult.get(i);
+ Task ret = tasks.get(i);
+ // task bind job id in highflip
+ queryTask.setJobid(job.getJobId());
+ queryTask.setTaskid(ret.getTaskid());
+ BeanUtils.copyProperties(queryTask, ret);
+ }
+ return tasks;
}
@Override
- public int getJobLogCount(Job job) {
+ public int getJobLogCount(com.baidu.highflip.core.entity.runtime.Job job) {
return 0;
}
@Override
- public Iterator getJobLog(Job job, int offset, int limit) {
+ public Iterator getJobLog(com.baidu.highflip.core.entity.runtime.Job job, int offset, int limit) {
return null;
}
}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/OperatorAdaptor.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/OperatorAdaptor.java
index 17c3625..bb66014 100644
--- a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/OperatorAdaptor.java
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/OperatorAdaptor.java
@@ -1,4 +1,30 @@
package com.webank.ai.fate.adaptor;
-public class OperatorAdaptor {
+import com.baidu.highflip.core.entity.runtime.Operator;
+
+public class OperatorAdaptor implements com.baidu.highflip.core.adaptor.OperatorAdaptor {
+ @Override
+ public int getOperatorCount() {
+ return 0;
+ }
+
+ @Override
+ public Operator getOperatorByIndex(int index, Operator operator) {
+ return null;
+ }
+
+ @Override
+ public Operator updateOperator(Operator operator) {
+ return null;
+ }
+
+ @Override
+ public boolean hasOperator(Operator operator) {
+ return false;
+ }
+
+ @Override
+ public void deleteOperator(Operator operator) {
+
+ }
}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/TaskAdaptor.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/TaskAdaptor.java
index 0fb81dc..b8a1e5d 100644
--- a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/TaskAdaptor.java
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/adaptor/TaskAdaptor.java
@@ -1,16 +1,98 @@
package com.webank.ai.fate.adaptor;
+import com.baidu.highflip.core.entity.runtime.Task;
+import com.baidu.highflip.core.entity.runtime.basic.Action;
+import com.baidu.highflip.core.entity.runtime.basic.Status;
+import com.baidu.highflip.core.exception.HighFlipException;
+import com.webank.ai.fate.client.form.task.FFateTask;
+import com.webank.ai.fate.client.form.task.FateTask;
import com.webank.ai.fate.context.FateContext;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.util.CollectionUtils;
+
@Slf4j
@Getter
-public class TaskAdaptor {
+public class TaskAdaptor implements com.baidu.highflip.core.adaptor.TaskAdaptor {
FateContext context;
public TaskAdaptor(FateContext context) {
this.context = context;
}
+
+ @Override
+ public Task updateTask(Task task) {
+ return null;
+ }
+
+ @Override
+ public void deleteTask(Task task) {
+
+ }
+
+ @Override
+ public boolean hasTask(Task task) {
+ return false;
+ }
+
+ @Override
+ public Status getTaskStatus(Task task) {
+ final List tasks =
+ getContext().getClient().taskQuery(task.getBingingId())
+ .getData().stream()
+ .map(FFateTask::convertToEntity)
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(tasks)) {
+ throw new RuntimeException("task not found: " + task);
+ }
+ final String status = tasks.get(0).getStatus();
+ switch (status) {
+ case "success":
+ return Status.SUCCEEDED;
+ case "timeout":
+ return Status.FAILED;
+ case "failed":
+ return Status.FAILED;
+ default:
+ return Status.UNKNOWN;
+ }
+ }
+
+ @Override
+ public Task controlTask(Task task, Action action, Map config) {
+ return null;
+ }
+
+ @Override
+ public int getTaskCount() {
+ return getContext().getClient().listTask(null, 1, Integer.MAX_VALUE).getData().getCount();
+ }
+
+ @Override
+ public Task getTaskByIndex(int index, Task task) {
+ log.info("get task by index:{}", index);
+ return FateTask.convertToEntity(getContext().getClient().listTask(null, index+1, 1).getData().getTasks().get(0));
+ }
+
+ @Override
+ public void invokeTask(Task task) {
+
+ }
+
+ @Override
+ public int getTaskLogCount(Task task) {
+ return 0;
+ }
+
+ @Override
+ public Iterator getTaskLog(Task task, int offset, int limit) {
+ return null;
+ }
}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/FateClient.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/FateClient.java
index 116a10b..3ea0b0c 100644
--- a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/FateClient.java
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/FateClient.java
@@ -1,85 +1,93 @@
package com.webank.ai.fate.client;
-import com.webank.ai.fate.client.form.JobQueryResponseForm;
-import com.webank.ai.fate.client.form.JsonResultForm;
import com.webank.ai.fate.client.form.ResultForm;
+import com.webank.ai.fate.client.form.data.Data;
+import com.webank.ai.fate.client.form.data.DataId;
+import com.webank.ai.fate.client.form.dsl.Dsl;
+import com.webank.ai.fate.client.form.dsl.DslConf;
+import com.webank.ai.fate.client.form.job.FateJob;
+import com.webank.ai.fate.client.form.job.JobData;
+import com.webank.ai.fate.client.form.job.QueryJob;
+import com.webank.ai.fate.client.form.task.FFateTask;
+import com.webank.ai.fate.client.form.task.TaskData;
+import com.webank.ai.fate.common.deserializer.FeignSpringFormEncoder;
import feign.Feign;
import feign.Headers;
+import feign.Logger;
import feign.Param;
import feign.Request;
import feign.RequestLine;
+import feign.Response;
+import feign.httpclient.ApacheHttpClient;
import feign.jackson.JacksonDecoder;
-import feign.jackson.JacksonEncoder;
+import org.springframework.lang.Nullable;
+import org.springframework.web.multipart.MultipartFile;
-import java.io.File;
import java.util.List;
import java.util.concurrent.TimeUnit;
-@Headers("Content-Type: application/json")
public interface FateClient {
static FateClient connect(String url) {
- return Feign.builder()
- .decoder(new JacksonDecoder())
- .encoder(new JacksonEncoder())
- .options(new Request.Options(
- 10, TimeUnit.SECONDS,
- 60, TimeUnit.SECONDS,
- true))
+ return Feign.builder().client(new ApacheHttpClient()).decoder(new JacksonDecoder())
+ .encoder(new FeignSpringFormEncoder()).logLevel(Logger.Level.NONE)
+ .options(new Request.Options(10, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true))
.target(FateClient.class, url);
}
- @RequestLine("POST /v1/version/get")
- JsonResultForm version();
-
- @RequestLine("POST /v1/version/get")
- JsonResultForm versionGet(@Param("module") String module);
-
@RequestLine("POST /v1/job/submit")
- String jobSumbit(@Param("job_dsl") String dsl,
- @Param("job_runtime_conf") String conf);
-
-
- @RequestLine("POST /v1/job/list/job")
- JsonResultForm jobList(@Param("limit") Integer limit);
+ @Headers("Content-Type: application/json")
+ ResultForm jobSubmit(@Param("job_dsl") Dsl dsl, @Param("job_runtime_conf") DslConf conf);
@RequestLine("POST /v1/job/stop")
+ @Headers("Content-Type: application/json")
void jobStop(@Param("job_id") String jobId);
@RequestLine("POST /v1/job/query")
- ResultForm> jobQuery(@Param("job_id") String jobId);
-
-
- /**
- *
- * @param head
- * @param id_delimiter
- * @param partition
- * @param table_name
- * @param namespace
- * @param storage_engine
- * @param destory
- * @param extend_sid
- * @return
- */
+ @Headers("Content-Type: application/json")
+ ResultForm> jobQuery(@Param("job_id") String jobId);
+
+ @RequestLine("POST /v1/job/list/job")
+ @Headers("Content-Type: application/json")
+ ResultForm listJob(@Param("page") int page, @Param("limit") int limit);
+
+ @RequestLine("POST /v1/job/task/query")
+ @Headers("Content-Type: application/json")
+ ResultForm> taskQuery(@Param("task_id") String taskId);
+
+ @RequestLine("POST /v1/job/list/task")
+ @Headers("Content-Type: application/json")
+ ResultForm listTask(@Param("job_id") @Nullable String jobId, @Param("page") int page,
+ @Param("limit") int limit);
+
+ @RequestLine("POST /v1/table/delete")
+ @Headers("Content-Type: application/json")
+ ResultForm deleteData(@Param(value = "table_name") String tableName,
+ @Param(value = "namespace") String nameSpace);
+
+ @RequestLine("GET /v1/table/download")
+ @Headers("Content-Type: application/json")
+ Response downloadData(@Param(value = "name") String tableName, @Param(value = "namespace") String nameSpace);
+
+ @RequestLine("POST /v1/data/upload")
@Headers("Content-Type: application/octet-stream")
- @RequestLine("POST /data/upload")
- JsonResultForm dataUpload(
- @Param("file") File file,
- @Param("head") Integer head,
- @Param("id_delimiter") String idDelimiter,
- @Param("partition") Integer partition,
- @Param("table_name") String tableName,
- @Param("namespace") String namespace,
- @Param("storage_engine") String storageEngine,
- @Param("destory") Integer destory,
- @Param("extend_sid") Integer extendSid);
-
-
- @RequestLine("POST /data/download")
- JsonResultForm dataDownload(
- @Param("table_name") String tableName,
- @Param("namespace") String namespace,
- @Param("output_path") String outputPath,
- @Param("delimiter") String delimiter);
+ ResultForm pushData(@Param(value = "file") MultipartFile file,
+ @Param(value = "id_delimiter") String id_delimiter, @Param(value = "head") String head,
+ @Param(value = "partition") String partition, @Param(value = "table_name") String table_name,
+ @Param(value = "namespace") String namespace, @Param(value = "storage_engine") String storage_engine,
+ @Param(value = "destroy") String destroy, @Param(value = "extend_sid") String extend_sid,
+ @Param(value = "drop") String drop);
+
+ @RequestLine("POST /v1/data/upload/history")
+ @Headers("Content-Type: application/json")
+ ResultForm getDataUploadHistory(@Param(value = "limit") int limit,
+ @Param(value = "job_id") String job_id);
+
+ @RequestLine("GET /v1/tracking/component/output/data/download")
+ @Headers("Content-Type: application/json")
+ Response downloadComponentResultData(@Param(value = "job_id") String tableName,
+ @Param(value = "component_name") String component_name,
+ @Param(value = "role") String role,
+ @Param(value = "party_id") String party_id);
+
}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/FateStatus.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/FateStatus.java
new file mode 100644
index 0000000..2bacde1
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/FateStatus.java
@@ -0,0 +1,45 @@
+package com.webank.ai.fate.client.form;
+
+import com.baidu.highflip.core.entity.runtime.basic.Status;
+
+public enum FateStatus {
+
+ WAITING("waiting"),
+ RUNNING("running"),
+ SUCCESS("success"),
+ FAILED("failed"),
+ ;
+ FateStatus(String value) {
+ this.value = value;
+ }
+
+ private final String value;
+
+ public String getValue() {
+ return value;
+ }
+
+ public static FateStatus fromValue(String value) {
+ for (FateStatus fateStatus : FateStatus.values()) {
+ if (fateStatus.getValue().equalsIgnoreCase(value)) {
+ return fateStatus;
+ }
+ }
+ throw new IllegalArgumentException();
+ }
+
+ public static Status convertToEntity(FateStatus fateStatus) {
+ switch (fateStatus) {
+ case WAITING:
+ return Status.APPENDING;
+ case RUNNING:
+ return Status.RUNNING;
+ case FAILED:
+ return Status.FAILED;
+ case SUCCESS:
+ return Status.SUCCEEDED;
+ }
+ throw new IllegalArgumentException();
+ }
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/data/Data.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/data/Data.java
new file mode 100644
index 0000000..51c7b64
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/data/Data.java
@@ -0,0 +1,21 @@
+package com.webank.ai.fate.client.form.data;
+
+import java.util.Map;
+
+@lombok.Data
+public class Data {
+
+ private String board_url;
+ private int code;
+ private String dsl_path;
+ private String job_id;
+ private String logs_directory;
+ private String message;
+ private Map model_info;
+ private String namespace;
+ private String pipeline_dsl_path;
+ private String runtime_conf_on_party_path;
+ private String runtime_conf_path;
+ private String table_name;
+ private String train_runtime_conf_path;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/data/DataId.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/data/DataId.java
new file mode 100644
index 0000000..a44fcf5
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/data/DataId.java
@@ -0,0 +1,12 @@
+package com.webank.ai.fate.client.form.data;
+
+import lombok.Data;
+
+@Data
+public class DataId {
+
+ private String table_name;
+
+ private String namespaces;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Component.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Component.java
new file mode 100644
index 0000000..30b6179
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Component.java
@@ -0,0 +1,14 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import lombok.Data;
+
+@Data
+public class Component {
+
+ private String module;
+
+ private Input input;
+
+ private Output output;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/ComponentParameters.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/ComponentParameters.java
new file mode 100644
index 0000000..5811b18
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/ComponentParameters.java
@@ -0,0 +1,17 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonMapMapObjectDeserializer;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class ComponentParameters {
+
+ @JsonDeserialize(using = JsonMapMapObjectDeserializer.class)
+ private Map> common;
+
+ private RoleConf role;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Components.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Components.java
new file mode 100644
index 0000000..39f40fa
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Components.java
@@ -0,0 +1,12 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class Components {
+
+ Map components;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Dsl.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Dsl.java
new file mode 100644
index 0000000..d90467c
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Dsl.java
@@ -0,0 +1,15 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonMapComponentsDeserializer;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class Dsl {
+
+ @JsonDeserialize(using = JsonMapComponentsDeserializer.class)
+ Map components;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/DslConf.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/DslConf.java
new file mode 100644
index 0000000..57498ef
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/DslConf.java
@@ -0,0 +1,22 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonMapListStringDeserializer;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class DslConf {
+
+ private String dsl_version;
+
+ private Site initiator;
+
+ @JsonDeserialize(using = JsonMapListStringDeserializer.class)
+ private Map> role;
+
+ private ComponentParameters component_parameters;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Input.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Input.java
new file mode 100644
index 0000000..051fa04
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Input.java
@@ -0,0 +1,23 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonListDeserializer;
+import com.webank.ai.fate.common.deserializer.JsonMapListStringDeserializer;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class Input {
+
+ @JsonDeserialize(using = JsonMapListStringDeserializer.class)
+ private Map> data;
+
+ @JsonDeserialize(using = JsonListDeserializer.class)
+ private List model;
+
+ @JsonDeserialize(using = JsonListDeserializer.class)
+ private List cache;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Output.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Output.java
new file mode 100644
index 0000000..c42906e
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Output.java
@@ -0,0 +1,21 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonListDeserializer;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Output {
+
+ @JsonDeserialize(using = JsonListDeserializer.class)
+ private List data;
+
+ @JsonDeserialize(using = JsonListDeserializer.class)
+ private List model;
+
+ @JsonDeserialize(using = JsonListDeserializer.class)
+ private List cache;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/RoleConf.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/RoleConf.java
new file mode 100644
index 0000000..ecc2fbe
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/RoleConf.java
@@ -0,0 +1,21 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonMapMapObjectDeserializer;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class RoleConf {
+
+ @JsonDeserialize(using = JsonMapMapObjectDeserializer.class)
+ private Map> host;
+
+ @JsonDeserialize(using = JsonMapMapObjectDeserializer.class)
+ private Map> guest;
+
+ @JsonDeserialize(using = JsonMapMapObjectDeserializer.class)
+ private Map> arbiter;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Site.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Site.java
new file mode 100644
index 0000000..6c048fd
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/dsl/Site.java
@@ -0,0 +1,12 @@
+package com.webank.ai.fate.client.form.dsl;
+
+import lombok.Data;
+
+@Data
+public class Site {
+
+ private String role;
+
+ private String party_id;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Adaptation_parameters.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Adaptation_parameters.java
new file mode 100644
index 0000000..8fe798b
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Adaptation_parameters.java
@@ -0,0 +1,22 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+@Data
+public class Adaptation_parameters {
+
+ private boolean if_initiator_baseline;
+
+ private int request_task_cores;
+
+ private int task_cores_per_node;
+
+ private int task_memory_per_node;
+
+ private int task_nodes;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Common.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Common.java
new file mode 100644
index 0000000..89cbcac
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Common.java
@@ -0,0 +1,14 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+@Data
+public class Common {
+
+ private Hetero_feature_binning hetero_feature_binning_0;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Components.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Components.java
new file mode 100644
index 0000000..74fe323
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Components.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Components {
+
+ private Dataio dataio_0;
+
+ private Hetero_feature_binning hetero_feature_binning_0;
+
+ private Intersection intersection_0;
+
+ private Reader reader_0;
+
+ public void setDataio_0(Dataio dataio_0) {
+ this.dataio_0 = dataio_0;
+ }
+
+ public Dataio getDataio_0() {
+ return dataio_0;
+ }
+
+ public void setHetero_feature_binning_0(Hetero_feature_binning hetero_feature_binning_0) {
+ this.hetero_feature_binning_0 = hetero_feature_binning_0;
+ }
+
+ public Hetero_feature_binning getHetero_feature_binning_0() {
+ return hetero_feature_binning_0;
+ }
+
+ public void setIntersection_0(Intersection intersection_0) {
+ this.intersection_0 = intersection_0;
+ }
+
+ public Intersection getIntersection_0() {
+ return intersection_0;
+ }
+
+ public void setReader_0(Reader reader_0) {
+ this.reader_0 = reader_0;
+ }
+
+ public Reader getReader_0() {
+ return reader_0;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Computing.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Computing.java
new file mode 100644
index 0000000..9456eae
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Computing.java
@@ -0,0 +1,16 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+@Data
+public class Computing {
+
+ private int cores_per_node;
+
+ private int nodes;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Dataio.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Dataio.java
new file mode 100644
index 0000000..89c7093
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Dataio.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Dataio {
+
+ private boolean with_label;
+
+ public void setWith_label(boolean with_label) {
+ this.with_label = with_label;
+ }
+
+ public boolean getWith_label() {
+ return with_label;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Eggroll_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Eggroll_run.java
new file mode 100644
index 0000000..bdd2bd9
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Eggroll_run.java
@@ -0,0 +1,9 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Eggroll_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Engines_address.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Engines_address.java
new file mode 100644
index 0000000..97f5d33
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Engines_address.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+@Data
+public class Engines_address {
+
+ private Computing computing;
+
+ private Federation federation;
+
+ private Storage storage;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/FateJob.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/FateJob.java
new file mode 100644
index 0000000..6b640fd
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/FateJob.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import com.baidu.highflip.core.entity.runtime.basic.Status;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.client.form.FateStatus;
+import com.webank.ai.fate.client.form.dsl.Dsl;
+import com.webank.ai.fate.common.deserializer.JsonMapStringDeserializer;
+import com.webank.ai.fate.common.deserializer.JsonStringDeserializer;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.joda.time.DateTime;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Data
+public class FateJob {
+
+ private long apply_resource_time;
+
+ private boolean cancel_signal;
+
+ private String cancel_time;
+
+ private int cores;
+
+ private String create_date;
+
+ private Date create_time;
+
+ private String description;
+
+ private Dsl dsl;
+
+ private long elapsed;
+
+ private String end_date;
+
+ private int end_scheduling_updates;
+
+ private Date end_time;
+
+ private String engine_name;
+
+ private String engine_type;
+
+ private String initiator_party_id;
+
+ private String initiator_role;
+
+ private boolean is_initiator;
+
+ private String job_id;
+
+ private int memory;
+
+ private String name;
+
+ private List partners;
+
+ private int party_id;
+
+ private int progress;
+
+ private boolean ready_signal;
+
+ private String ready_time;
+
+ private int remaining_cores;
+
+ private int remaining_memory;
+
+ private boolean rerun_signal;
+
+ private boolean resource_in_use;
+
+ private long return_resource_time;
+
+ @JsonDeserialize(using = JsonStringDeserializer.class)
+ private String role;
+
+ @JsonDeserialize(using = JsonMapStringDeserializer.class)
+ private Map roles;
+
+ private Runtime_conf runtime_conf;
+
+ private Runtime_conf_on_party runtime_conf_on_party;
+
+ private String start_date;
+
+ private Date start_time;
+
+ private String status;
+
+ private String status_code;
+
+ private String tag;
+
+ private Train_runtime_conf train_runtime_conf;
+
+ private String update_date;
+
+ private Date update_time;
+
+ private User user;
+
+ private String user_id;
+
+ public static com.baidu.highflip.core.entity.runtime.Job convertToEntity(FateJob response) {
+ com.baidu.highflip.core.entity.runtime.Job job = new com.baidu.highflip.core.entity.runtime.Job();
+// job.setJobId();
+ job.setJobName(response.getName());
+ job.setDescription(response.getDescription());
+ job.setCreateTime(new DateTime(response.getCreate_time()));
+ job.setUpdateTime(new DateTime(response.getUpdate_time()));
+ job.setFinishTime(new DateTime(response.getEnd_time()));
+// job.setGraph();
+ job.setStatus(FateStatus.convertToEntity(FateStatus.fromValue(response.getStatus())));
+// job.setMessage();
+// job.setIsDeleted();
+// job.setInputTasks();
+// job.setOutputTasks();
+ job.setBingingId(response.getJob_id());
+// job.setBinding();
+ return job;
+ }
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Federation.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Federation.java
new file mode 100644
index 0000000..9fa754e
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Federation.java
@@ -0,0 +1,16 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+@Data
+public class Federation {
+
+ private int cores_per_node;
+
+ private int nodes;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Hetero_feature_binning.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Hetero_feature_binning.java
new file mode 100644
index 0000000..00920c5
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Hetero_feature_binning.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Hetero_feature_binning {
+
+ private Transform_param transform_param;
+
+ public void setTransform_param(Transform_param transform_param) {
+ this.transform_param = transform_param;
+ }
+
+ public Transform_param getTransform_param() {
+ return transform_param;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Input.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Input.java
new file mode 100644
index 0000000..5db61a9
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Input.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class Input {
+
+ private InputData data;
+
+ @Data
+ public static class InputData {
+
+ private List data;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Intersection.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Intersection.java
new file mode 100644
index 0000000..f0d298d
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Intersection.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Intersection {
+
+ private Input input;
+
+ private String module;
+
+ private Output output;
+
+ public void setInput(Input input) {
+ this.input = input;
+ }
+
+ public Input getInput() {
+ return input;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setOutput(Output output) {
+ this.output = output;
+ }
+
+ public Output getOutput() {
+ return output;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/JobData.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/JobData.java
new file mode 100644
index 0000000..b9937ec
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/JobData.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class JobData {
+
+ private int count;
+
+ private List jobs;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Job_parameters.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Job_parameters.java
new file mode 100644
index 0000000..8631a12
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Job_parameters.java
@@ -0,0 +1,50 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class Job_parameters {
+
+ private Adaptation_parameters adaptation_parameters;
+
+ private int auto_retries;
+
+ private int auto_retry_delay;
+
+ private String computing_engine;
+
+ private int computing_partitions;
+
+ private Eggroll_run eggroll_run;
+
+ private Engines_address engines_address;
+
+ private String federated_mode;
+
+ private String federated_status_collect_type;
+
+ private String federation_engine;
+
+ private String job_type;
+
+ private String model_id;
+
+ private String model_version;
+
+ private Map pulsar_run;
+
+ private Map rabbitmq_run;
+
+ private Map spark_run;
+
+ private String storage_engine;
+
+ private int task_parallelism;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Output.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Output.java
new file mode 100644
index 0000000..7844095
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Output.java
@@ -0,0 +1,21 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import java.util.List;
+
+public class Output {
+
+ private List data;
+
+ public void setData(List data) {
+ this.data = data;
+ }
+
+ public List getData() {
+ return data;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Pulsar_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Pulsar_run.java
new file mode 100644
index 0000000..2837c57
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Pulsar_run.java
@@ -0,0 +1,9 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Pulsar_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/QueryJob.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/QueryJob.java
new file mode 100644
index 0000000..8e758c4
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/QueryJob.java
@@ -0,0 +1,106 @@
+package com.webank.ai.fate.client.form.job;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.client.form.dsl.Dsl;
+import com.webank.ai.fate.common.deserializer.JsonMapStringDeserializer;
+import com.webank.ai.fate.common.deserializer.JsonStringDeserializer;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class QueryJob {
+
+ private long f_apply_resource_time;
+
+ private boolean f_cancel_signal;
+
+ private String f_cancel_time;
+
+ private int f_cores;
+
+ private String f_create_date;
+
+ private Date f_create_time;
+
+ private String f_description;
+
+ private Dsl f_dsl;
+
+ private long f_elapsed;
+
+ private String f_end_date;
+
+ private int f_end_scheduling_updates;
+
+ private Date f_end_time;
+
+ private String f_engine_name;
+
+ private String f_engine_type;
+
+ private String f_initiator_party_id;
+
+ private String f_initiator_role;
+
+ private boolean f_is_initiator;
+
+ private String f_job_id;
+
+ private int f_memory;
+
+ private String f_name;
+
+ private List f_partners;
+
+ private int f_party_id;
+
+ private int f_progress;
+
+ private boolean f_ready_signal;
+
+ private String f_ready_time;
+
+ private int f_remaining_cores;
+
+ private int f_remaining_memory;
+
+ private boolean f_rerun_signal;
+
+ private boolean f_resource_in_use;
+
+ private long f_return_resource_time;
+
+ @JsonDeserialize(using = JsonStringDeserializer.class)
+ private String f_role;
+
+ @JsonDeserialize(using = JsonMapStringDeserializer.class)
+ private Map f_roles;
+
+ private Runtime_conf f_runtime_conf;
+
+ private Runtime_conf_on_party f_runtime_conf_on_party;
+
+ private String f_start_date;
+
+ private Date f_start_time;
+
+ private String f_status;
+
+ private String f_status_code;
+
+ private String f_tag;
+
+ private Train_runtime_conf f_train_runtime_conf;
+
+ private String f_update_date;
+
+ private Date f_update_time;
+
+ private User f_user;
+
+ private String f_user_id;
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Rabbitmq_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Rabbitmq_run.java
new file mode 100644
index 0000000..69e7e6b
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Rabbitmq_run.java
@@ -0,0 +1,9 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Rabbitmq_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Reader.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Reader.java
new file mode 100644
index 0000000..5ca5261
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Reader.java
@@ -0,0 +1,19 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Reader {
+
+ private Table table;
+
+ public void setTable(Table table) {
+ this.table = table;
+ }
+
+ public Table getTable() {
+ return table;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Roles.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Roles.java
new file mode 100644
index 0000000..5b41ac9
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Roles.java
@@ -0,0 +1,18 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Roles {
+
+ private List guest;
+
+ private List host;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Runtime_conf.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Runtime_conf.java
new file mode 100644
index 0000000..302937b
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Runtime_conf.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.client.form.dsl.ComponentParameters;
+import com.webank.ai.fate.client.form.dsl.Site;
+import com.webank.ai.fate.common.deserializer.JsonMapStringDeserializer;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class Runtime_conf {
+
+ private ComponentParameters component_parameters;
+
+ private String conf_path;
+
+ private String dsl_path;
+
+ private int dsl_version;
+
+ private Site initiator;
+
+ private Job_parameters job_parameters;
+
+ @JsonDeserialize(using = JsonMapStringDeserializer.class)
+ private Map role;
+
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Runtime_conf_on_party.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Runtime_conf_on_party.java
new file mode 100644
index 0000000..3a4c14c
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Runtime_conf_on_party.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.client.form.dsl.ComponentParameters;
+import com.webank.ai.fate.client.form.dsl.Site;
+import com.webank.ai.fate.common.deserializer.JsonMapStringDeserializer;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class Runtime_conf_on_party {
+
+ private ComponentParameters component_parameters;
+
+ private String conf_path;
+
+ private String dsl_path;
+
+ private int dsl_version;
+
+ private Site initiator;
+
+ private Job_parameters job_parameters;
+
+ @JsonDeserialize(using = JsonMapStringDeserializer.class)
+ private Map role;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Spark_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Spark_run.java
new file mode 100644
index 0000000..09d7be4
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Spark_run.java
@@ -0,0 +1,9 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Spark_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Storage.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Storage.java
new file mode 100644
index 0000000..70df472
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Storage.java
@@ -0,0 +1,16 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+@Data
+public class Storage {
+
+ private int cores_per_node;
+
+ private int nodes;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Table.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Table.java
new file mode 100644
index 0000000..93866f6
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Table.java
@@ -0,0 +1,17 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+
+import lombok.Data;
+
+@Data
+public class Table {
+
+ private String name;
+
+ private String namespace;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Train_runtime_conf.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Train_runtime_conf.java
new file mode 100644
index 0000000..ae6c312
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Train_runtime_conf.java
@@ -0,0 +1,9 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+public class Train_runtime_conf {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Transform_param.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Transform_param.java
new file mode 100644
index 0000000..166cc37
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/Transform_param.java
@@ -0,0 +1,14 @@
+/**
+ * Copyright 2022 bejson.com
+ */
+
+package com.webank.ai.fate.client.form.job;
+
+import lombok.Data;
+
+@Data
+public class Transform_param {
+
+ private String transform_type;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/User.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/User.java
new file mode 100644
index 0000000..04c9b02
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/job/User.java
@@ -0,0 +1,18 @@
+package com.webank.ai.fate.client.form.job;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonMapStringDeserializer;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class User {
+
+ @JsonDeserialize(using = JsonMapStringDeserializer.class)
+ private Map guest;
+
+ @JsonDeserialize(using = JsonMapStringDeserializer.class)
+ private Map host;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Adaptation_parameters.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Adaptation_parameters.java
new file mode 100644
index 0000000..011bd6f
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Adaptation_parameters.java
@@ -0,0 +1,14 @@
+
+package com.webank.ai.fate.client.form.task;
+
+import lombok.Data;
+
+@Data
+public class Adaptation_parameters {
+
+ private boolean if_initiator_baseline;
+ private int request_task_cores;
+ private int task_cores_per_node;
+ private int task_memory_per_node;
+ private int task_nodes;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Class_path.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Class_path.java
new file mode 100644
index 0000000..b4228cf
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Class_path.java
@@ -0,0 +1,16 @@
+
+package com.webank.ai.fate.client.form.task;
+
+import lombok.Data;
+
+
+@Data
+public class Class_path {
+
+ private String feature_instance;
+ private String feature_vector;
+ private String homo_model_convert;
+ private String Interface;
+ private String model;
+ private String model_migrate;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Common.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Common.java
new file mode 100644
index 0000000..7afbc31
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Common.java
@@ -0,0 +1,28 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Common {
+
+ private Adaptation_parameters adaptation_parameters;
+ private int auto_retries;
+ private int auto_retry_delay;
+ private String computing_engine;
+ private int computing_partitions;
+ private Eggroll_run eggroll_run;
+ private Engines_address engines_address;
+ private String federated_mode;
+ private String federated_status_collect_type;
+ private String federation_engine;
+ private String job_type;
+ private String model_id;
+ private String model_version;
+ private Pulsar_run pulsar_run;
+ private Rabbitmq_run rabbitmq_run;
+ private Spark_run spark_run;
+ private String storage_engine;
+ private int task_parallelism;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/ComponentParam.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/ComponentParam.java
new file mode 100644
index 0000000..b6de203
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/ComponentParam.java
@@ -0,0 +1,31 @@
+
+package com.webank.ai.fate.client.form.task;
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+public class ComponentParam {
+
+ private List _feeded_deprecated_params;
+ private boolean _is_raw_conf;
+ private String _name;
+ private List _user_feeded_params;
+ private double adjustment_factor;
+ private int bin_indexes;
+ private String bin_names;
+ private int bin_num;
+ private String category_indexes;
+ private String category_names;
+ private int compress_thres;
+ private Encrypt_param encrypt_param;
+ private double error;
+ private int head_size;
+ private boolean local_only;
+ private String method;
+ private boolean need_run;
+ private Optimal_binning_param optimal_binning_param;
+ private boolean skip_static;
+ private Transform_param transform_param;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Component_parameters.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Component_parameters.java
new file mode 100644
index 0000000..51cde37
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Component_parameters.java
@@ -0,0 +1,21 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Component_parameters {
+
+ private String CodePath;
+ private ComponentParam ComponentParam;
+ private String conf_path;
+ private String dsl_path;
+ private int dsl_version;
+ private Initiator initiator;
+ private Job_parameters job_parameters;
+ private Local local;
+ private String module;
+ private Role role;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Eggroll_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Eggroll_run.java
new file mode 100644
index 0000000..bfe6f19
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Eggroll_run.java
@@ -0,0 +1,7 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+public class Eggroll_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Encrypt_param.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Encrypt_param.java
new file mode 100644
index 0000000..d64a45e
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Encrypt_param.java
@@ -0,0 +1,13 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Encrypt_param {
+
+ private int key_length;
+ private String method;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Engine_conf.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Engine_conf.java
new file mode 100644
index 0000000..c710198
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Engine_conf.java
@@ -0,0 +1,12 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Engine_conf {
+
+ private String computing_engine;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Engines_address.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Engines_address.java
new file mode 100644
index 0000000..bba10cf
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Engines_address.java
@@ -0,0 +1,7 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+public class Engines_address {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Env.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Env.java
new file mode 100644
index 0000000..76b0cee
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Env.java
@@ -0,0 +1,11 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Env {
+
+ private String PYTHONPATH;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/FFateTask.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/FFateTask.java
new file mode 100644
index 0000000..a639960
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/FFateTask.java
@@ -0,0 +1,63 @@
+package com.webank.ai.fate.client.form.task;
+
+import java.util.Date;
+import java.util.List;
+
+import org.joda.time.DateTime;
+
+import com.baidu.highflip.core.entity.runtime.Task;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonListDeserializer;
+
+import lombok.Data;
+
+@Data
+public class FFateTask {
+ private int f_auto_retries;
+ private int f_auto_retry_delay;
+ @JsonDeserialize(using = JsonListDeserializer.class)
+ private List f_cmd;
+ private String f_component_module;
+ private String f_component_name;
+ private Component_parameters f_component_parameters;
+ private Date f_create_time;
+ private int f_elapsed;
+ private Date f_end_time;
+ private Engine_conf f_engine_conf;
+ private String f_federated_mode;
+ private String f_federated_status_collect_type;
+ private String f_initiator_party_id;
+ private String f_initiator_role;
+ // job_id is the job id in FATE
+ private String f_job_id;
+ private String f_party_id;
+ private String f_party_status;
+ private Provider_info f_provider_info;
+ private String f_role;
+ private String f_run_ip;
+ private boolean f_run_on_this_party;
+ private int f_run_pid;
+ private Date f_start_time;
+ /**
+ * f_status is one of waiting,running,canceled,timeout,failed,pass,success
+ */
+ private String f_status;
+ private String f_status_code;
+ private String f_task_id;
+ private int f_task_version;
+ private Date f_update_time;
+ private String f_worker_id;
+
+ public static Task convertToEntity(FFateTask data) {
+ Task task = new Task();
+ task.setName(data.getF_component_name());
+ task.setCreateTime(new DateTime(data.getF_create_time()));
+ task.setUpdateTime(new DateTime(data.getF_update_time()));
+ task.setFinishTime(new DateTime(data.getF_end_time()));
+ task.setNodeName(data.getF_component_name());
+ task.setStatus(data.getF_status());
+ task.setBingingId(data.getF_task_id());
+ return task;
+ }
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/FateTask.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/FateTask.java
new file mode 100644
index 0000000..e0a3b8b
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/FateTask.java
@@ -0,0 +1,61 @@
+
+package com.webank.ai.fate.client.form.task;
+
+import com.baidu.highflip.core.entity.runtime.Task;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.webank.ai.fate.common.deserializer.JsonListDeserializer;
+import lombok.Data;
+import org.joda.time.DateTime;
+
+import java.util.Date;
+import java.util.List;
+
+
+@Data
+public class FateTask {
+
+ private int auto_retries;
+ private int auto_retry_delay;
+ @JsonDeserialize(using = JsonListDeserializer.class)
+ private List cmd;
+ private String component_module;
+ private String component_name;
+ private Component_parameters component_parameters;
+ private Date create_time;
+ private int elapsed;
+ private Date end_time;
+ private Engine_conf engine_conf;
+ private String federated_mode;
+ private String federated_status_collect_type;
+ private String initiator_party_id;
+ private String initiator_role;
+ // job_id is the job id in FATE
+ private String job_id;
+ private String party_id;
+ private String party_status;
+ private Provider_info provider_info;
+ private String role;
+ private String run_ip;
+ private boolean run_on_this_party;
+ private int run_pid;
+ private Date start_time;
+ private String status;
+ private String status_code;
+ private String task_id;
+ private int task_version;
+ private Date update_time;
+ private String worker_id;
+
+ public static Task convertToEntity(FateTask data) {
+ Task task = new Task();
+ task.setName(data.getComponent_name());
+ task.setCreateTime(new DateTime(data.getCreate_time()));
+ task.setUpdateTime(new DateTime(data.getUpdate_time()));
+ task.setFinishTime(new DateTime(data.getEnd_time()));
+ task.setNodeName(data.getComponent_name());
+ task.setStatus(data.getStatus());
+ task.setBingingId(data.getTask_id());
+ return task;
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Initiator.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Initiator.java
new file mode 100644
index 0000000..d4746fc
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Initiator.java
@@ -0,0 +1,13 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Initiator {
+
+ private int party_id;
+ private String role;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Job_parameters.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Job_parameters.java
new file mode 100644
index 0000000..35e1cb7
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Job_parameters.java
@@ -0,0 +1,12 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Job_parameters {
+
+ private Common common;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Local.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Local.java
new file mode 100644
index 0000000..2e66e13
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Local.java
@@ -0,0 +1,13 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Local {
+
+ private int party_id;
+ private String role;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Optimal_binning_param.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Optimal_binning_param.java
new file mode 100644
index 0000000..9cdaf7d
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Optimal_binning_param.java
@@ -0,0 +1,18 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+import lombok.Data;
+
+@Data
+public class Optimal_binning_param {
+
+ private String adjustment_factor;
+ private int init_bin_nums;
+ private String init_bucket_method;
+ private String max_bin;
+ private int max_bin_pct;
+ private String metric_method;
+ private double min_bin_pct;
+ private boolean mixture;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Provider_info.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Provider_info.java
new file mode 100644
index 0000000..211fab1
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Provider_info.java
@@ -0,0 +1,15 @@
+
+package com.webank.ai.fate.client.form.task;
+
+import lombok.Data;
+
+
+@Data
+public class Provider_info {
+
+ private Class_path class_path;
+ private Env env;
+ private String name;
+ private String path;
+ private String version;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Pulsar_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Pulsar_run.java
new file mode 100644
index 0000000..a5b6e13
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Pulsar_run.java
@@ -0,0 +1,7 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+public class Pulsar_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Rabbitmq_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Rabbitmq_run.java
new file mode 100644
index 0000000..ef0032b
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Rabbitmq_run.java
@@ -0,0 +1,7 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+public class Rabbitmq_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Role.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Role.java
new file mode 100644
index 0000000..51c34d1
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Role.java
@@ -0,0 +1,14 @@
+
+package com.webank.ai.fate.client.form.task;
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+public class Role {
+
+ private List guest;
+ private List host;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Spark_run.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Spark_run.java
new file mode 100644
index 0000000..6412c4f
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Spark_run.java
@@ -0,0 +1,7 @@
+
+package com.webank.ai.fate.client.form.task;
+
+
+public class Spark_run {
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/TaskData.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/TaskData.java
new file mode 100644
index 0000000..9c3a8c5
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/TaskData.java
@@ -0,0 +1,14 @@
+
+package com.webank.ai.fate.client.form.task;
+import lombok.Data;
+
+import java.util.List;
+
+
+@Data
+public class TaskData {
+
+ private int count;
+ private List tasks;
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Transform_param.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Transform_param.java
new file mode 100644
index 0000000..5fefc0f
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/client/form/task/Transform_param.java
@@ -0,0 +1,14 @@
+
+package com.webank.ai.fate.client.form.task;
+import lombok.Data;
+
+import java.util.Date;
+
+
+@Data
+public class Transform_param {
+
+ private Date transform_cols;
+ private String transform_names;
+ private String transform_type;
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/ConfigConst.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/ConfigConst.java
new file mode 100644
index 0000000..ab137c1
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/ConfigConst.java
@@ -0,0 +1,7 @@
+package com.webank.ai.fate.common;
+
+public interface ConfigConst {
+
+ String FLOW_URL_CONFIG="highflip.adaptor.fate.fate-flow.url";
+
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/DataMultipartFile.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/DataMultipartFile.java
new file mode 100644
index 0000000..ed844dd
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/DataMultipartFile.java
@@ -0,0 +1,76 @@
+package com.webank.ai.fate.common;
+
+import org.springframework.lang.NonNull;
+import org.springframework.util.Base64Utils;
+import org.springframework.util.FileCopyUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class DataMultipartFile implements MultipartFile {
+
+ private String originalFilename = "file";
+
+ private final String contentType = "application/octet-stream";
+
+ private final byte[] content;
+
+ public DataMultipartFile(String filename, byte[] bytes) {
+ if (filename != null) {
+ this.originalFilename = filename;
+ }
+ this.content = bytes;
+ }
+
+ public DataMultipartFile(String filename, String base64str) {
+ if (filename != null) {
+ this.originalFilename = filename;
+ }
+ this.content = Base64Utils.decodeFromString(base64str);
+ }
+
+ @Override
+ @NonNull
+ public String getName() {
+ return this.originalFilename;
+ }
+
+ @Override
+ public String getOriginalFilename() {
+ return this.originalFilename;
+ }
+
+ @Override
+ public String getContentType() {
+ return this.contentType;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return (this.content.length == 0);
+ }
+
+ @Override
+ public long getSize() {
+ return this.content.length;
+ }
+
+ @Override
+ public byte[] getBytes() throws IOException {
+ return this.content;
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException {
+ return new ByteArrayInputStream(this.content);
+ }
+
+ @Override
+ public void transferTo(File dest) throws IOException, IllegalStateException {
+ FileCopyUtils.copy(this.content, dest);
+ }
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/DecompressUtils.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/DecompressUtils.java
new file mode 100644
index 0000000..aa2d2b1
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/DecompressUtils.java
@@ -0,0 +1,39 @@
+package com.webank.ai.fate.common;
+
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.springframework.lang.Nullable;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.zip.GZIPInputStream;
+
+public class DecompressUtils {
+
+ public static Map decompressTarGzToStringMap(InputStream tarGzInputStream, @Nullable Function fileNameFilter) {
+ if (fileNameFilter == null) {
+ fileNameFilter = s -> true;
+ }
+ Map result = new HashMap<>();
+ try (GZIPInputStream gis = new GZIPInputStream(tarGzInputStream);TarArchiveInputStream tais = new TarArchiveInputStream(gis)) {
+ int i = 0;
+ TarArchiveEntry entry;
+ while ((entry = tais.getNextTarEntry()) != null) {
+ if (fileNameFilter.apply(entry.getName())) {
+ String text = new BufferedReader(new InputStreamReader(tais, StandardCharsets.UTF_8)).lines().collect(Collectors.joining("\n"));
+ result.put(entry.getName(), text);
+ }
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return result;
+ }
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/FateConstants.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/FateConstants.java
new file mode 100644
index 0000000..7931da6
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/FateConstants.java
@@ -0,0 +1,7 @@
+package com.webank.ai.fate.common;
+
+public class FateConstants {
+ public static final String DATA_ID_SEPARATOR = "\\+";
+
+ public static final String DATA_ID_CONNECTOR = "+";
+}
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/GZIPUtils.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/GZIPUtils.java
new file mode 100644
index 0000000..bbc891f
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/GZIPUtils.java
@@ -0,0 +1,84 @@
+package com.webank.ai.fate.common;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+public class GZIPUtils {
+ public static final String GZIP_ENCODE_UTF_8 = "UTF-8";
+ public static final String GZIP_ENCODE_ISO_8859_1 = "ISO-8859-1";
+
+
+ public static byte[] compress(String str, String encoding) {
+ if (str == null || str.length() == 0) {
+ return null;
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ GZIPOutputStream gzip;
+ try {
+ gzip = new GZIPOutputStream(out);
+ gzip.write(str.getBytes(encoding));
+ gzip.close();
+ } catch ( Exception e) {
+ e.printStackTrace();
+ }
+ return out.toByteArray();
+ }
+
+ public static byte[] compress(String str) throws IOException {
+ return compress(str, GZIP_ENCODE_UTF_8);
+ }
+
+ public static byte[] uncompress(byte[] bytes) {
+ if (bytes == null || bytes.length == 0) {
+ return null;
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+ try {
+ GZIPInputStream ungzip = new GZIPInputStream(in);
+ byte[] buffer = new byte[256];
+ int n;
+ while ((n = ungzip.read(buffer)) >= 0) {
+ out.write(buffer, 0, n);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return out.toByteArray();
+ }
+
+ public static String uncompressToString(byte[] bytes, String encoding) {
+ if (bytes == null || bytes.length == 0) {
+ return null;
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+ try {
+ GZIPInputStream ungzip = new GZIPInputStream(in);
+ byte[] buffer = new byte[256];
+ int n;
+ while ((n = ungzip.read(buffer)) >= 0) {
+ out.write(buffer, 0, n);
+ }
+ return out.toString(encoding);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static String uncompressToString(byte[] bytes) {
+ return uncompressToString(bytes, GZIP_ENCODE_UTF_8);
+ }
+
+ public static void main(String[] args) throws IOException {
+ String s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
+ System.out.println("字符串长度:"+s.length());
+ System.out.println("压缩后::"+compress(s).length);
+ System.out.println("解压后:"+uncompress(compress(s)).length);
+ System.out.println("解压字符串后::"+uncompressToString(compress(s)).length());
+ }
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/FeignSpringFormEncoder.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/FeignSpringFormEncoder.java
new file mode 100644
index 0000000..5da179c
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/FeignSpringFormEncoder.java
@@ -0,0 +1,255 @@
+package com.webank.ai.fate.common.deserializer;
+
+import feign.RequestTemplate;
+import feign.codec.EncodeException;
+import feign.codec.Encoder;
+import feign.jackson.JacksonEncoder;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpOutputMessage;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Type;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class FeignSpringFormEncoder extends JacksonEncoder implements Encoder {
+
+ private final List> converters = new RestTemplate().getMessageConverters();
+
+ public static final Charset UTF_8 = Charset.forName("UTF-8");
+
+ public FeignSpringFormEncoder() {}
+
+ /**
+ * 实现一个 HttpOutputMessage
+ */
+ private class HttpOutputMessageImpl implements HttpOutputMessage {
+ /**
+ * 输出流,请求体
+ */
+ private final OutputStream body;
+ /**
+ * 请求头
+ */
+ private final HttpHeaders headers;
+
+ public HttpOutputMessageImpl(OutputStream body, HttpHeaders headers) {
+ this.body = body;
+ this.headers = headers;
+ }
+
+ @Override
+ public OutputStream getBody() throws IOException {
+ return body;
+ }
+
+ @Override
+ public HttpHeaders getHeaders() {
+ return headers;
+ }
+ }
+
+ /**
+ * 内部静态类,保存 MultipartFile 数据
+ */
+ static class MultipartFileResource extends InputStreamResource {
+ /**
+ * 文件名
+ */
+ private final String filename;
+ /**
+ * 文件大小
+ */
+ private final long size;
+
+ /**
+ * 构造方法
+ */
+ public MultipartFileResource(InputStream inputStream, String filename, long size) {
+ super(inputStream);
+ this.filename = filename;
+ this.size = size;
+ }
+
+ @Override
+ public String getFilename() {
+ return this.filename;
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException, IllegalStateException {
+ return super.getInputStream();
+ }
+
+ @Override
+ public long contentLength() throws IOException {
+ return size;
+ }
+ }
+
+ /**
+ * 重写编码器
+ */
+ @Override
+ public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
+ if (isJsonRequest(template)){
+ super.encode(object, bodyType, template);
+ } else {
+ final HttpHeaders multipartHeaders = new HttpHeaders();
+ multipartHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
+ encodeMultipartFormRequest((Map) object, multipartHeaders, template);
+ }
+ }
+
+ private boolean isJsonRequest(RequestTemplate requestTemplate) {
+ for (Map.Entry> header : requestTemplate.headers().entrySet()) {
+ if (header.getKey().equalsIgnoreCase("Content-Type")) {
+ for (String type : header.getValue()) {
+ if (type.contains("json")) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 对有文件、表单的进行编码
+ */
+ private void encodeMultipartFormRequest(Map formMap, HttpHeaders multipartHeaders, RequestTemplate template){
+ if (formMap == null){
+ throw new EncodeException("无法对格式为null的请求进行编码。");
+ }
+
+ LinkedMultiValueMap map = new LinkedMultiValueMap<>();
+ //对每个参数进行检查校验
+ for (Map.Entry entry : formMap.entrySet()){
+ Object value = entry.getValue();
+ //不同的数据类型进行不同的编码逻辑处理
+ if (isMultipartFile(value)){
+ //单个文件
+ map.add(entry.getKey(), encodeMultipartFile((MultipartFile)value));
+
+ } else if (isMultipartFileArray(value)){
+ //多个文件
+ encodeMultipartFiles(map, (String) entry.getKey(), Arrays.asList((MultipartFile[]) value));
+
+ } else {
+ //普通请求数据
+ map.add(entry.getKey(), encodeJsonObject(value));
+ }
+ }
+
+ encodeRequest(map, multipartHeaders, template);
+ }
+
+ /**
+ * 对请求进行编码
+ */
+ private void encodeRequest(Object value, HttpHeaders requestHeaders, RequestTemplate template){
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ HttpOutputMessage dummyRequest = new HttpOutputMessageImpl(outputStream, requestHeaders);
+
+ try {
+ Class> requestType = value.getClass();
+ MediaType requestContentType = requestHeaders.getContentType();
+ for (HttpMessageConverter> messageConverter : converters){
+ if (messageConverter.canWrite(requestType, requestContentType)){
+ ((HttpMessageConverter) messageConverter).write(value, requestContentType, dummyRequest);
+ break;
+ }
+ }
+ } catch (IOException e) {
+ throw new EncodeException("无法对请求进行编码:", e);
+ }
+
+ HttpHeaders headers = dummyRequest.getHeaders();
+ if (headers != null){
+ for (Map.Entry> entry : headers.entrySet()){
+ template.header(entry.getKey(), entry.getValue());
+ }
+ }
+
+ /*
+ 请使用模板输出流。。。如果文件太大,这将导致问题,因为整个请求都将在内存中。
+ */
+ template.body(outputStream.toByteArray(), UTF_8);
+ }
+
+ /**
+ * 编码为json对象
+ */
+ private HttpEntity> encodeJsonObject(Object obj){
+ HttpHeaders jsonPartHeaders = new HttpHeaders();
+ jsonPartHeaders.setContentType(MediaType.APPLICATION_JSON);
+ return new HttpEntity<>(obj, jsonPartHeaders);
+ }
+
+ /**
+ * 编码MultipartFile文件,将其转换为HttpEntity,同时设置 Content-type 为 application/octet-stream
+ * @param map 当前请求 map.
+ * @param name 数组字段的名称
+ * @param fileList 要处理的文件
+ */
+ private void encodeMultipartFiles(LinkedMultiValueMap map, String name, List extends MultipartFile> fileList){
+ HttpHeaders filePartHeaders = new HttpHeaders();
+ //设置 Content-type
+ filePartHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ try {
+ for (MultipartFile file : fileList){
+ Resource multipartFileResource = new MultipartFileResource(file.getInputStream(), file.getOriginalFilename(), file.getSize());
+ map.add(name, new HttpEntity<>(multipartFileResource, filePartHeaders));
+ }
+ } catch (IOException e) {
+ throw new EncodeException("无法对请求进行编码:", e);
+ }
+ }
+
+ /**
+ * 编码MultipartFile文件,将其转换为HttpEntity,同时设置 Content-type 为 application/octet-stream
+ * @param file 要编码的文件
+ */
+ private HttpEntity> encodeMultipartFile(MultipartFile file){
+ HttpHeaders filePartHeaders = new HttpHeaders();
+ //设置 Content-type
+ filePartHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+ try {
+ Resource multipartFileResource = new MultipartFileResource(file.getInputStream(), file.getOriginalFilename(), file.getSize());
+ return new HttpEntity<>(multipartFileResource, filePartHeaders);
+ } catch (IOException e) {
+ throw new EncodeException("无法对请求进行编码:", e);
+ }
+ }
+
+ /**
+ * 判断是否多个 MultipartFile
+ */
+ private boolean isMultipartFileArray(Object object){
+ return object != null && object.getClass().isArray() && MultipartFile.class.isAssignableFrom(object.getClass().getComponentType());
+ }
+
+ /**
+ * 判断是否MultipartFile文件
+ * @param object 要判断的对象
+ */
+ private boolean isMultipartFile(Object object){
+ return object instanceof MultipartFile;
+ }
+
+
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/JsonListDeserializer.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/JsonListDeserializer.java
new file mode 100644
index 0000000..33f2b0d
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/JsonListDeserializer.java
@@ -0,0 +1,34 @@
+package com.webank.ai.fate.common.deserializer;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class JsonListDeserializer extends StdDeserializer> {
+
+ public JsonListDeserializer() {
+ super(List.class);
+ }
+
+ @Override
+ public List deserialize(JsonParser parser, DeserializationContext context)
+ throws IOException {
+ JsonNode node = parser.getCodec().readTree(parser);
+ List result = new ArrayList<>();
+ if (node.isArray()) {
+ for (JsonNode element : node) {
+ result.add(element.asText());
+ }
+ } else if (node.isObject()) {
+ result.add(node.asText());
+ } else {
+ //maybe nothing?
+ }
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/JsonMapComponentsDeserializer.java b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/JsonMapComponentsDeserializer.java
new file mode 100644
index 0000000..580d056
--- /dev/null
+++ b/highflip-vendors/highflip-adaptor-fate/src/main/java/com/webank/ai/fate/common/deserializer/JsonMapComponentsDeserializer.java
@@ -0,0 +1,36 @@
+package com.webank.ai.fate.common.deserializer;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.webank.ai.fate.client.form.dsl.Component;
+
+import java.io.IOException;
+import java.util.Map;
+
+public class JsonMapComponentsDeserializer extends StdDeserializer