丁云鹏 1 gadu atpakaļ
vecāks
revīzija
c850038d70

+ 47 - 8
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/Exp.java

@@ -29,6 +29,21 @@ public final class Exp {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_GetExpResponse_ExpEntry_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_GetExpResponse_ExpProtoEntry_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_GetExpResponse_ExpProtoEntry_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_ExpProto_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_ExpProto_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_ExpProto_ParamEntry_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_ExpProto_ParamEntry_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -41,13 +56,19 @@ public final class Exp {
       "\n\"com/tzld/piaoquan/abtest/exp.proto\032%co" +
       "m/tzld/piaoquan/abtest/common.proto\"J\n\rG" +
       "etExpRequest\022\013\n\003mid\030\001 \001(\t\022\013\n\003uid\030\002 \001(\t\022\020" +
-      "\n\010app_type\030\003 \001(\005\022\r\n\005group\030\004 \001(\t\"|\n\016GetEx" +
-      "pResponse\022\027\n\006result\030\001 \001(\0132\007.Result\022%\n\003ex" +
-      "p\030\002 \003(\0132\030.GetExpResponse.ExpEntry\032*\n\010Exp" +
-      "Entry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\00127\n" +
-      "\nExpService\022)\n\006getExp\022\016.GetExpRequest\032\017." +
-      "GetExpResponseB,\n%com.tzld.piaoquan.abte" +
-      "st.client.modelP\001\210\001\001b\006proto3"
+      "\n\010app_type\030\003 \001(\005\022\r\n\005group\030\004 \001(\t\"\352\001\n\016GetE" +
+      "xpResponse\022\027\n\006result\030\001 \001(\0132\007.Result\022%\n\003e" +
+      "xp\030\002 \003(\0132\030.GetExpResponse.ExpEntry\0220\n\tex" +
+      "p_proto\030\003 \003(\0132\035.GetExpResponse.ExpProtoE" +
+      "ntry\032*\n\010ExpEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002" +
+      " \001(\t:\0028\001\032:\n\rExpProtoEntry\022\013\n\003key\030\001 \001(\t\022\030" +
+      "\n\005value\030\002 \001(\0132\t.ExpProto:\0028\001\"m\n\010ExpProto" +
+      "\022\016\n\006exp_id\030\001 \001(\t\022#\n\005param\030\002 \003(\0132\024.ExpPro" +
+      "to.ParamEntry\032,\n\nParamEntry\022\013\n\003key\030\001 \001(\t" +
+      "\022\r\n\005value\030\002 \001(\t:\0028\00127\n\nExpService\022)\n\006get" +
+      "Exp\022\016.GetExpRequest\032\017.GetExpResponseB,\n%" +
+      "com.tzld.piaoquan.abtest.client.modelP\001\210" +
+      "\001\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -65,13 +86,31 @@ public final class Exp {
     internal_static_GetExpResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetExpResponse_descriptor,
-        new java.lang.String[] { "Result", "Exp", });
+        new java.lang.String[] { "Result", "Exp", "ExpProto", });
     internal_static_GetExpResponse_ExpEntry_descriptor =
       internal_static_GetExpResponse_descriptor.getNestedTypes().get(0);
     internal_static_GetExpResponse_ExpEntry_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_GetExpResponse_ExpEntry_descriptor,
         new java.lang.String[] { "Key", "Value", });
+    internal_static_GetExpResponse_ExpProtoEntry_descriptor =
+      internal_static_GetExpResponse_descriptor.getNestedTypes().get(1);
+    internal_static_GetExpResponse_ExpProtoEntry_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_GetExpResponse_ExpProtoEntry_descriptor,
+        new java.lang.String[] { "Key", "Value", });
+    internal_static_ExpProto_descriptor =
+      getDescriptor().getMessageTypes().get(2);
+    internal_static_ExpProto_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_ExpProto_descriptor,
+        new java.lang.String[] { "ExpId", "Param", });
+    internal_static_ExpProto_ParamEntry_descriptor =
+      internal_static_ExpProto_descriptor.getNestedTypes().get(0);
+    internal_static_ExpProto_ParamEntry_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_ExpProto_ParamEntry_descriptor,
+        new java.lang.String[] { "Key", "Value", });
     com.tzld.piaoquan.abtest.client.model.Common.getDescriptor();
   }
 

+ 843 - 0
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/ExpProto.java

@@ -0,0 +1,843 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/abtest/exp.proto
+
+package com.tzld.piaoquan.abtest.client.model;
+
+/**
+ * Protobuf type {@code ExpProto}
+ */
+public final class ExpProto extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:ExpProto)
+    ExpProtoOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use ExpProto.newBuilder() to construct.
+  private ExpProto(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private ExpProto() {
+    expId_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new ExpProto();
+  }
+
+  @java.lang.Override
+  public final com.google.protobuf.UnknownFieldSet
+  getUnknownFields() {
+    return this.unknownFields;
+  }
+  private ExpProto(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    this();
+    if (extensionRegistry == null) {
+      throw new java.lang.NullPointerException();
+    }
+    int mutable_bitField0_ = 0;
+    com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+        com.google.protobuf.UnknownFieldSet.newBuilder();
+    try {
+      boolean done = false;
+      while (!done) {
+        int tag = input.readTag();
+        switch (tag) {
+          case 0:
+            done = true;
+            break;
+          case 10: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            expId_ = s;
+            break;
+          }
+          case 18: {
+            if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+              param_ = com.google.protobuf.MapField.newMapField(
+                  ParamDefaultEntryHolder.defaultEntry);
+              mutable_bitField0_ |= 0x00000001;
+            }
+            com.google.protobuf.MapEntry<java.lang.String, java.lang.String>
+            param__ = input.readMessage(
+                ParamDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+            param_.getMutableMap().put(
+                param__.getKey(), param__.getValue());
+            break;
+          }
+          default: {
+            if (!parseUnknownField(
+                input, unknownFields, extensionRegistry, tag)) {
+              done = true;
+            }
+            break;
+          }
+        }
+      }
+    } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (java.io.IOException e) {
+      throw new com.google.protobuf.InvalidProtocolBufferException(
+          e).setUnfinishedMessage(this);
+    } finally {
+      this.unknownFields = unknownFields.build();
+      makeExtensionsImmutable();
+    }
+  }
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.tzld.piaoquan.abtest.client.model.Exp.internal_static_ExpProto_descriptor;
+  }
+
+  @SuppressWarnings({"rawtypes"})
+  @java.lang.Override
+  protected com.google.protobuf.MapField internalGetMapField(
+      int number) {
+    switch (number) {
+      case 2:
+        return internalGetParam();
+      default:
+        throw new RuntimeException(
+            "Invalid map field number: " + number);
+    }
+  }
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.tzld.piaoquan.abtest.client.model.Exp.internal_static_ExpProto_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.tzld.piaoquan.abtest.client.model.ExpProto.class, com.tzld.piaoquan.abtest.client.model.ExpProto.Builder.class);
+  }
+
+  public static final int EXP_ID_FIELD_NUMBER = 1;
+  private volatile java.lang.Object expId_;
+  /**
+   * <code>string exp_id = 1;</code>
+   * @return The expId.
+   */
+  @java.lang.Override
+  public java.lang.String getExpId() {
+    java.lang.Object ref = expId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      expId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string exp_id = 1;</code>
+   * @return The bytes for expId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getExpIdBytes() {
+    java.lang.Object ref = expId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      expId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PARAM_FIELD_NUMBER = 2;
+  private static final class ParamDefaultEntryHolder {
+    static final com.google.protobuf.MapEntry<
+        java.lang.String, java.lang.String> defaultEntry =
+            com.google.protobuf.MapEntry
+            .<java.lang.String, java.lang.String>newDefaultInstance(
+                com.tzld.piaoquan.abtest.client.model.Exp.internal_static_ExpProto_ParamEntry_descriptor, 
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "",
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "");
+  }
+  private com.google.protobuf.MapField<
+      java.lang.String, java.lang.String> param_;
+  private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+  internalGetParam() {
+    if (param_ == null) {
+      return com.google.protobuf.MapField.emptyMapField(
+          ParamDefaultEntryHolder.defaultEntry);
+    }
+    return param_;
+  }
+
+  public int getParamCount() {
+    return internalGetParam().getMap().size();
+  }
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+
+  @java.lang.Override
+  public boolean containsParam(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    return internalGetParam().getMap().containsKey(key);
+  }
+  /**
+   * Use {@link #getParamMap()} instead.
+   */
+  @java.lang.Override
+  @java.lang.Deprecated
+  public java.util.Map<java.lang.String, java.lang.String> getParam() {
+    return getParamMap();
+  }
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.util.Map<java.lang.String, java.lang.String> getParamMap() {
+    return internalGetParam().getMap();
+  }
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.lang.String getParamOrDefault(
+      java.lang.String key,
+      java.lang.String defaultValue) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.String> map =
+        internalGetParam().getMap();
+    return map.containsKey(key) ? map.get(key) : defaultValue;
+  }
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+  @java.lang.Override
+
+  public java.lang.String getParamOrThrow(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, java.lang.String> map =
+        internalGetParam().getMap();
+    if (!map.containsKey(key)) {
+      throw new java.lang.IllegalArgumentException();
+    }
+    return map.get(key);
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!getExpIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, expId_);
+    }
+    com.google.protobuf.GeneratedMessageV3
+      .serializeStringMapTo(
+        output,
+        internalGetParam(),
+        ParamDefaultEntryHolder.defaultEntry,
+        2);
+    unknownFields.writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!getExpIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, expId_);
+    }
+    for (java.util.Map.Entry<java.lang.String, java.lang.String> entry
+         : internalGetParam().getMap().entrySet()) {
+      com.google.protobuf.MapEntry<java.lang.String, java.lang.String>
+      param__ = ParamDefaultEntryHolder.defaultEntry.newBuilderForType()
+          .setKey(entry.getKey())
+          .setValue(entry.getValue())
+          .build();
+      size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, param__);
+    }
+    size += unknownFields.getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.tzld.piaoquan.abtest.client.model.ExpProto)) {
+      return super.equals(obj);
+    }
+    com.tzld.piaoquan.abtest.client.model.ExpProto other = (com.tzld.piaoquan.abtest.client.model.ExpProto) obj;
+
+    if (!getExpId()
+        .equals(other.getExpId())) return false;
+    if (!internalGetParam().equals(
+        other.internalGetParam())) return false;
+    if (!unknownFields.equals(other.unknownFields)) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + EXP_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getExpId().hashCode();
+    if (!internalGetParam().getMap().isEmpty()) {
+      hash = (37 * hash) + PARAM_FIELD_NUMBER;
+      hash = (53 * hash) + internalGetParam().hashCode();
+    }
+    hash = (29 * hash) + unknownFields.hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.tzld.piaoquan.abtest.client.model.ExpProto prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code ExpProto}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:ExpProto)
+      com.tzld.piaoquan.abtest.client.model.ExpProtoOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.tzld.piaoquan.abtest.client.model.Exp.internal_static_ExpProto_descriptor;
+    }
+
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMapField(
+        int number) {
+      switch (number) {
+        case 2:
+          return internalGetParam();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @SuppressWarnings({"rawtypes"})
+    protected com.google.protobuf.MapField internalGetMutableMapField(
+        int number) {
+      switch (number) {
+        case 2:
+          return internalGetMutableParam();
+        default:
+          throw new RuntimeException(
+              "Invalid map field number: " + number);
+      }
+    }
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.tzld.piaoquan.abtest.client.model.Exp.internal_static_ExpProto_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.tzld.piaoquan.abtest.client.model.ExpProto.class, com.tzld.piaoquan.abtest.client.model.ExpProto.Builder.class);
+    }
+
+    // Construct using com.tzld.piaoquan.abtest.client.model.ExpProto.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      expId_ = "";
+
+      internalGetMutableParam().clear();
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.tzld.piaoquan.abtest.client.model.Exp.internal_static_ExpProto_descriptor;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.abtest.client.model.ExpProto getDefaultInstanceForType() {
+      return com.tzld.piaoquan.abtest.client.model.ExpProto.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.abtest.client.model.ExpProto build() {
+      com.tzld.piaoquan.abtest.client.model.ExpProto result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.tzld.piaoquan.abtest.client.model.ExpProto buildPartial() {
+      com.tzld.piaoquan.abtest.client.model.ExpProto result = new com.tzld.piaoquan.abtest.client.model.ExpProto(this);
+      int from_bitField0_ = bitField0_;
+      result.expId_ = expId_;
+      result.param_ = internalGetParam();
+      result.param_.makeImmutable();
+      onBuilt();
+      return result;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.tzld.piaoquan.abtest.client.model.ExpProto) {
+        return mergeFrom((com.tzld.piaoquan.abtest.client.model.ExpProto)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.tzld.piaoquan.abtest.client.model.ExpProto other) {
+      if (other == com.tzld.piaoquan.abtest.client.model.ExpProto.getDefaultInstance()) return this;
+      if (!other.getExpId().isEmpty()) {
+        expId_ = other.expId_;
+        onChanged();
+      }
+      internalGetMutableParam().mergeFrom(
+          other.internalGetParam());
+      this.mergeUnknownFields(other.unknownFields);
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      com.tzld.piaoquan.abtest.client.model.ExpProto parsedMessage = null;
+      try {
+        parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        parsedMessage = (com.tzld.piaoquan.abtest.client.model.ExpProto) e.getUnfinishedMessage();
+        throw e.unwrapIOException();
+      } finally {
+        if (parsedMessage != null) {
+          mergeFrom(parsedMessage);
+        }
+      }
+      return this;
+    }
+    private int bitField0_;
+
+    private java.lang.Object expId_ = "";
+    /**
+     * <code>string exp_id = 1;</code>
+     * @return The expId.
+     */
+    public java.lang.String getExpId() {
+      java.lang.Object ref = expId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        expId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string exp_id = 1;</code>
+     * @return The bytes for expId.
+     */
+    public com.google.protobuf.ByteString
+        getExpIdBytes() {
+      java.lang.Object ref = expId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        expId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string exp_id = 1;</code>
+     * @param value The expId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setExpId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      expId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string exp_id = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearExpId() {
+      
+      expId_ = getDefaultInstance().getExpId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string exp_id = 1;</code>
+     * @param value The bytes for expId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setExpIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      expId_ = value;
+      onChanged();
+      return this;
+    }
+
+    private com.google.protobuf.MapField<
+        java.lang.String, java.lang.String> param_;
+    private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+    internalGetParam() {
+      if (param_ == null) {
+        return com.google.protobuf.MapField.emptyMapField(
+            ParamDefaultEntryHolder.defaultEntry);
+      }
+      return param_;
+    }
+    private com.google.protobuf.MapField<java.lang.String, java.lang.String>
+    internalGetMutableParam() {
+      onChanged();;
+      if (param_ == null) {
+        param_ = com.google.protobuf.MapField.newMapField(
+            ParamDefaultEntryHolder.defaultEntry);
+      }
+      if (!param_.isMutable()) {
+        param_ = param_.copy();
+      }
+      return param_;
+    }
+
+    public int getParamCount() {
+      return internalGetParam().getMap().size();
+    }
+    /**
+     * <code>map&lt;string, string&gt; param = 2;</code>
+     */
+
+    @java.lang.Override
+    public boolean containsParam(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      return internalGetParam().getMap().containsKey(key);
+    }
+    /**
+     * Use {@link #getParamMap()} instead.
+     */
+    @java.lang.Override
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.String> getParam() {
+      return getParamMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; param = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.util.Map<java.lang.String, java.lang.String> getParamMap() {
+      return internalGetParam().getMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; param = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.lang.String getParamOrDefault(
+        java.lang.String key,
+        java.lang.String defaultValue) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.String> map =
+          internalGetParam().getMap();
+      return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+    /**
+     * <code>map&lt;string, string&gt; param = 2;</code>
+     */
+    @java.lang.Override
+
+    public java.lang.String getParamOrThrow(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, java.lang.String> map =
+          internalGetParam().getMap();
+      if (!map.containsKey(key)) {
+        throw new java.lang.IllegalArgumentException();
+      }
+      return map.get(key);
+    }
+
+    public Builder clearParam() {
+      internalGetMutableParam().getMutableMap()
+          .clear();
+      return this;
+    }
+    /**
+     * <code>map&lt;string, string&gt; param = 2;</code>
+     */
+
+    public Builder removeParam(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableParam().getMutableMap()
+          .remove(key);
+      return this;
+    }
+    /**
+     * Use alternate mutation accessors instead.
+     */
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, java.lang.String>
+    getMutableParam() {
+      return internalGetMutableParam().getMutableMap();
+    }
+    /**
+     * <code>map&lt;string, string&gt; param = 2;</code>
+     */
+    public Builder putParam(
+        java.lang.String key,
+        java.lang.String value) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      if (value == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableParam().getMutableMap()
+          .put(key, value);
+      return this;
+    }
+    /**
+     * <code>map&lt;string, string&gt; param = 2;</code>
+     */
+
+    public Builder putAllParam(
+        java.util.Map<java.lang.String, java.lang.String> values) {
+      internalGetMutableParam().getMutableMap()
+          .putAll(values);
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:ExpProto)
+  }
+
+  // @@protoc_insertion_point(class_scope:ExpProto)
+  private static final com.tzld.piaoquan.abtest.client.model.ExpProto DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.tzld.piaoquan.abtest.client.model.ExpProto();
+  }
+
+  public static com.tzld.piaoquan.abtest.client.model.ExpProto getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<ExpProto>
+      PARSER = new com.google.protobuf.AbstractParser<ExpProto>() {
+    @java.lang.Override
+    public ExpProto parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return new ExpProto(input, extensionRegistry);
+    }
+  };
+
+  public static com.google.protobuf.Parser<ExpProto> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<ExpProto> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.tzld.piaoquan.abtest.client.model.ExpProto getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 55 - 0
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/ExpProtoOrBuilder.java

@@ -0,0 +1,55 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: com/tzld/piaoquan/abtest/exp.proto
+
+package com.tzld.piaoquan.abtest.client.model;
+
+public interface ExpProtoOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:ExpProto)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string exp_id = 1;</code>
+   * @return The expId.
+   */
+  java.lang.String getExpId();
+  /**
+   * <code>string exp_id = 1;</code>
+   * @return The bytes for expId.
+   */
+  com.google.protobuf.ByteString
+      getExpIdBytes();
+
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+  int getParamCount();
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+  boolean containsParam(
+      java.lang.String key);
+  /**
+   * Use {@link #getParamMap()} instead.
+   */
+  @java.lang.Deprecated
+  java.util.Map<java.lang.String, java.lang.String>
+  getParam();
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+  java.util.Map<java.lang.String, java.lang.String>
+  getParamMap();
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+
+  java.lang.String getParamOrDefault(
+      java.lang.String key,
+      java.lang.String defaultValue);
+  /**
+   * <code>map&lt;string, string&gt; param = 2;</code>
+   */
+
+  java.lang.String getParamOrThrow(
+      java.lang.String key);
+}

+ 255 - 0
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GetExpResponse.java

@@ -75,6 +75,19 @@ private static final long serialVersionUID = 0L;
                 exp__.getKey(), exp__.getValue());
             break;
           }
+          case 26: {
+            if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+              expProto_ = com.google.protobuf.MapField.newMapField(
+                  ExpProtoDefaultEntryHolder.defaultEntry);
+              mutable_bitField0_ |= 0x00000002;
+            }
+            com.google.protobuf.MapEntry<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+            expProto__ = input.readMessage(
+                ExpProtoDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
+            expProto_.getMutableMap().put(
+                expProto__.getKey(), expProto__.getValue());
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -106,6 +119,8 @@ private static final long serialVersionUID = 0L;
     switch (number) {
       case 2:
         return internalGetExp();
+      case 3:
+        return internalGetExpProto();
       default:
         throw new RuntimeException(
             "Invalid map field number: " + number);
@@ -226,6 +241,87 @@ private static final long serialVersionUID = 0L;
     return map.get(key);
   }
 
+  public static final int EXP_PROTO_FIELD_NUMBER = 3;
+  private static final class ExpProtoDefaultEntryHolder {
+    static final com.google.protobuf.MapEntry<
+        java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> defaultEntry =
+            com.google.protobuf.MapEntry
+            .<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>newDefaultInstance(
+                com.tzld.piaoquan.abtest.client.model.Exp.internal_static_GetExpResponse_ExpProtoEntry_descriptor, 
+                com.google.protobuf.WireFormat.FieldType.STRING,
+                "",
+                com.google.protobuf.WireFormat.FieldType.MESSAGE,
+                com.tzld.piaoquan.abtest.client.model.ExpProto.getDefaultInstance());
+  }
+  private com.google.protobuf.MapField<
+      java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> expProto_;
+  private com.google.protobuf.MapField<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+  internalGetExpProto() {
+    if (expProto_ == null) {
+      return com.google.protobuf.MapField.emptyMapField(
+          ExpProtoDefaultEntryHolder.defaultEntry);
+    }
+    return expProto_;
+  }
+
+  public int getExpProtoCount() {
+    return internalGetExpProto().getMap().size();
+  }
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+
+  @java.lang.Override
+  public boolean containsExpProto(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    return internalGetExpProto().getMap().containsKey(key);
+  }
+  /**
+   * Use {@link #getExpProtoMap()} instead.
+   */
+  @java.lang.Override
+  @java.lang.Deprecated
+  public java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> getExpProto() {
+    return getExpProtoMap();
+  }
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+  @java.lang.Override
+
+  public java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> getExpProtoMap() {
+    return internalGetExpProto().getMap();
+  }
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+  @java.lang.Override
+
+  public com.tzld.piaoquan.abtest.client.model.ExpProto getExpProtoOrDefault(
+      java.lang.String key,
+      com.tzld.piaoquan.abtest.client.model.ExpProto defaultValue) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> map =
+        internalGetExpProto().getMap();
+    return map.containsKey(key) ? map.get(key) : defaultValue;
+  }
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+  @java.lang.Override
+
+  public com.tzld.piaoquan.abtest.client.model.ExpProto getExpProtoOrThrow(
+      java.lang.String key) {
+    if (key == null) { throw new java.lang.NullPointerException(); }
+    java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> map =
+        internalGetExpProto().getMap();
+    if (!map.containsKey(key)) {
+      throw new java.lang.IllegalArgumentException();
+    }
+    return map.get(key);
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -249,6 +345,12 @@ private static final long serialVersionUID = 0L;
         internalGetExp(),
         ExpDefaultEntryHolder.defaultEntry,
         2);
+    com.google.protobuf.GeneratedMessageV3
+      .serializeStringMapTo(
+        output,
+        internalGetExpProto(),
+        ExpProtoDefaultEntryHolder.defaultEntry,
+        3);
     unknownFields.writeTo(output);
   }
 
@@ -272,6 +374,16 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(2, exp__);
     }
+    for (java.util.Map.Entry<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> entry
+         : internalGetExpProto().getMap().entrySet()) {
+      com.google.protobuf.MapEntry<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+      expProto__ = ExpProtoDefaultEntryHolder.defaultEntry.newBuilderForType()
+          .setKey(entry.getKey())
+          .setValue(entry.getValue())
+          .build();
+      size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, expProto__);
+    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -294,6 +406,8 @@ private static final long serialVersionUID = 0L;
     }
     if (!internalGetExp().equals(
         other.internalGetExp())) return false;
+    if (!internalGetExpProto().equals(
+        other.internalGetExpProto())) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -313,6 +427,10 @@ private static final long serialVersionUID = 0L;
       hash = (37 * hash) + EXP_FIELD_NUMBER;
       hash = (53 * hash) + internalGetExp().hashCode();
     }
+    if (!internalGetExpProto().getMap().isEmpty()) {
+      hash = (37 * hash) + EXP_PROTO_FIELD_NUMBER;
+      hash = (53 * hash) + internalGetExpProto().hashCode();
+    }
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -426,6 +544,8 @@ private static final long serialVersionUID = 0L;
       switch (number) {
         case 2:
           return internalGetExp();
+        case 3:
+          return internalGetExpProto();
         default:
           throw new RuntimeException(
               "Invalid map field number: " + number);
@@ -437,6 +557,8 @@ private static final long serialVersionUID = 0L;
       switch (number) {
         case 2:
           return internalGetMutableExp();
+        case 3:
+          return internalGetMutableExpProto();
         default:
           throw new RuntimeException(
               "Invalid map field number: " + number);
@@ -475,6 +597,7 @@ private static final long serialVersionUID = 0L;
         resultBuilder_ = null;
       }
       internalGetMutableExp().clear();
+      internalGetMutableExpProto().clear();
       return this;
     }
 
@@ -509,6 +632,8 @@ private static final long serialVersionUID = 0L;
       }
       result.exp_ = internalGetExp();
       result.exp_.makeImmutable();
+      result.expProto_ = internalGetExpProto();
+      result.expProto_.makeImmutable();
       onBuilt();
       return result;
     }
@@ -562,6 +687,8 @@ private static final long serialVersionUID = 0L;
       }
       internalGetMutableExp().mergeFrom(
           other.internalGetExp());
+      internalGetMutableExpProto().mergeFrom(
+          other.internalGetExpProto());
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -838,6 +965,134 @@ private static final long serialVersionUID = 0L;
           .putAll(values);
       return this;
     }
+
+    private com.google.protobuf.MapField<
+        java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> expProto_;
+    private com.google.protobuf.MapField<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+    internalGetExpProto() {
+      if (expProto_ == null) {
+        return com.google.protobuf.MapField.emptyMapField(
+            ExpProtoDefaultEntryHolder.defaultEntry);
+      }
+      return expProto_;
+    }
+    private com.google.protobuf.MapField<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+    internalGetMutableExpProto() {
+      onChanged();;
+      if (expProto_ == null) {
+        expProto_ = com.google.protobuf.MapField.newMapField(
+            ExpProtoDefaultEntryHolder.defaultEntry);
+      }
+      if (!expProto_.isMutable()) {
+        expProto_ = expProto_.copy();
+      }
+      return expProto_;
+    }
+
+    public int getExpProtoCount() {
+      return internalGetExpProto().getMap().size();
+    }
+    /**
+     * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+     */
+
+    @java.lang.Override
+    public boolean containsExpProto(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      return internalGetExpProto().getMap().containsKey(key);
+    }
+    /**
+     * Use {@link #getExpProtoMap()} instead.
+     */
+    @java.lang.Override
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> getExpProto() {
+      return getExpProtoMap();
+    }
+    /**
+     * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+     */
+    @java.lang.Override
+
+    public java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> getExpProtoMap() {
+      return internalGetExpProto().getMap();
+    }
+    /**
+     * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+     */
+    @java.lang.Override
+
+    public com.tzld.piaoquan.abtest.client.model.ExpProto getExpProtoOrDefault(
+        java.lang.String key,
+        com.tzld.piaoquan.abtest.client.model.ExpProto defaultValue) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> map =
+          internalGetExpProto().getMap();
+      return map.containsKey(key) ? map.get(key) : defaultValue;
+    }
+    /**
+     * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+     */
+    @java.lang.Override
+
+    public com.tzld.piaoquan.abtest.client.model.ExpProto getExpProtoOrThrow(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> map =
+          internalGetExpProto().getMap();
+      if (!map.containsKey(key)) {
+        throw new java.lang.IllegalArgumentException();
+      }
+      return map.get(key);
+    }
+
+    public Builder clearExpProto() {
+      internalGetMutableExpProto().getMutableMap()
+          .clear();
+      return this;
+    }
+    /**
+     * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+     */
+
+    public Builder removeExpProto(
+        java.lang.String key) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableExpProto().getMutableMap()
+          .remove(key);
+      return this;
+    }
+    /**
+     * Use alternate mutation accessors instead.
+     */
+    @java.lang.Deprecated
+    public java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+    getMutableExpProto() {
+      return internalGetMutableExpProto().getMutableMap();
+    }
+    /**
+     * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+     */
+    public Builder putExpProto(
+        java.lang.String key,
+        com.tzld.piaoquan.abtest.client.model.ExpProto value) {
+      if (key == null) { throw new java.lang.NullPointerException(); }
+      if (value == null) { throw new java.lang.NullPointerException(); }
+      internalGetMutableExpProto().getMutableMap()
+          .put(key, value);
+      return this;
+    }
+    /**
+     * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+     */
+
+    public Builder putAllExpProto(
+        java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto> values) {
+      internalGetMutableExpProto().getMutableMap()
+          .putAll(values);
+      return this;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {

+ 34 - 0
abtest-client/src/main/java/com/tzld/piaoquan/abtest/client/model/GetExpResponseOrBuilder.java

@@ -55,4 +55,38 @@ public interface GetExpResponseOrBuilder extends
 
   java.lang.String getExpOrThrow(
       java.lang.String key);
+
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+  int getExpProtoCount();
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+  boolean containsExpProto(
+      java.lang.String key);
+  /**
+   * Use {@link #getExpProtoMap()} instead.
+   */
+  @java.lang.Deprecated
+  java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+  getExpProto();
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+  java.util.Map<java.lang.String, com.tzld.piaoquan.abtest.client.model.ExpProto>
+  getExpProtoMap();
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+
+  com.tzld.piaoquan.abtest.client.model.ExpProto getExpProtoOrDefault(
+      java.lang.String key,
+      com.tzld.piaoquan.abtest.client.model.ExpProto defaultValue);
+  /**
+   * <code>map&lt;string, .ExpProto&gt; exp_proto = 3;</code>
+   */
+
+  com.tzld.piaoquan.abtest.client.model.ExpProto getExpProtoOrThrow(
+      java.lang.String key);
 }

+ 6 - 0
abtest-client/src/main/proto/com/tzld/piaoquan/abtest/exp.proto

@@ -16,6 +16,12 @@ message GetExpRequest {
 message GetExpResponse {
   Result result = 1;
   map<string, string> exp = 2;
+  map<string, ExpProto> exp_proto = 3;
+}
+
+message ExpProto {
+  string exp_id = 1;
+  map<string, string> param = 2;
 }
 
 service ExpService {

+ 1 - 0
abtest-service/src/main/java/com/tzld/piaoquan/abtest/model/ExpConfig.java

@@ -38,5 +38,6 @@ public class ExpConfig {
     public static class Exp {
         private String expId;
         private int[] range;
+        private Map<String, String> param;
     }
 }

+ 7 - 0
abtest-service/src/main/java/com/tzld/piaoquan/abtest/service/ExpService.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.abtest.service;
 
 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.google.common.reflect.TypeToken;
+import com.tzld.piaoquan.abtest.client.model.ExpProto;
 import com.tzld.piaoquan.abtest.client.model.GetExpRequest;
 import com.tzld.piaoquan.abtest.client.model.GetExpResponse;
 import com.tzld.piaoquan.abtest.client.model.Result;
@@ -48,6 +49,7 @@ public class ExpService {
 
                 if (CollectionUtils.isNotEmpty(layers)) {
                     Map<String, String> expIdMap = new HashMap<>();
+                    Map<String, ExpProto> expMap = new HashMap<>();
                     for (ExpConfig.Layer layer : layers) {
                         for (ExpConfig.Exp exp : layer.getExps()) {
                             if (bucketMap.containsKey(layer.getLayerId())
@@ -55,12 +57,17 @@ public class ExpService {
                                     && exp.getRange()[0] <= bucketMap.get(layer.getLayerId())
                                     && exp.getRange()[1] >= bucketMap.get(layer.getLayerId())) {
                                 expIdMap.put(layer.getLayerId(), exp.getExpId());
+                                expMap.put(layer.getLayerId(), ExpProto.newBuilder()
+                                        .setExpId(exp.getExpId())
+                                        .putAllParam(exp.getParam() == null ? Collections.emptyMap() : exp.getParam())
+                                        .build());
                             }
                         }
                     }
                     return GetExpResponse.newBuilder()
                             .setResult(Result.newBuilder().setCode(1))
                             .putAllExp(expIdMap)
+                            .putAllExpProto(expMap)
                             .build();
                 }
             }

+ 0 - 1
abtest-service/src/main/java/com/tzld/piaoquan/abtest/service/GroupService.java

@@ -98,7 +98,6 @@ public class GroupService {
                         groupMap.put(layer.getLayerId(), RandomUtils.nextInt(0, bucketNum) + "");
                     }
                     switch (policy) {
-
                         case "inherit":
                             groupMap.put(layer.getLayerId(), oldGroupMap.getOrDefault(layer.getLayerId(),
                                     RandomUtils.nextInt(0, bucketNum) + ""));