From 7c75abbf7e4e5d0237f55d8ef0f666fd0b783f81 Mon Sep 17 00:00:00 2001 From: Konrad `ktoso` Malawski Date: Thu, 4 Jan 2018 17:21:47 +0100 Subject: [PATCH] +str #24229 move SinkRef / SourceRef to akka.stream +str #24229 remove protobuf changes, which do not need to be made in this PR docs moved things config object subscription timeout confifmed working, also, attributes document attributes for sub timeout tests for the source also failing when it should additional demand test implemented protection from materializing "in cycles"; would be nice in types but that breaks the niceness of use of the types SinkRef/SourceRef... cleanup no idle timeout built in, can use the Timeout stages more docs simplest change to prevent exposing SinkRef => SourceRef => SinkRef cycle Things to decide: * is it ok to require using `getSource` / `getSink` as Java API, is there better naming? * where should the constructors go? I'd say just in regular javadsl/scaladsl `Source`/ `Sink` objects move constructors to {javadsl,scaladsl}.{Source,Sink} companion objects Remove now useless "canMaterialize" field Separate stage (implementation) from ref (wrapped actor ref) to make it clearer what is serialized Clarify that partner refs are not optional in on-the-wire interfaces minor cleanup in SourceRefStage Renamed the stages but questionable if that really helps ;) cleanups, better docs cleanup, fix docs compilation fix mima got rid of Futures in the materialized values of stream refs --- .../scala/akka/actor/dungeon/Children.scala | 8 +- .../scala/akka/pattern/PipeToSupport.scala | 2 + .../protobuf/msg/TwoPhaseSetMessages.java | 1236 ---------- .../persistence/proto/FlightAppModels.java | 823 ------- .../paradox/images/source-ref-animation.gif | Bin 0 -> 79177 bytes akka-docs/src/main/paradox/stream/index.md | 1 + .../src/main/paradox/stream/stream-refs.md | 166 ++ .../docs/stream/FlowStreamRefsDocSpec.scala | 125 + .../scala/akka/remote/artery/SendQueue.scala | 3 +- .../akka/stream/remote/StreamRefsSpec.scala | 274 --- .../akka/stream/scaladsl/StreamRefsSpec.scala | 366 +++ ...Containers.java => StreamRefMessages.java} | 2030 ++++++++--------- .../mima-filters/2.5.10.backwards.excludes | 3 + ...ntainers.proto => StreamRefMessages.proto} | 20 +- akka-stream/src/main/resources/reference.conf | 64 +- .../scala/akka/stream/ActorMaterializer.scala | 61 +- .../main/scala/akka/stream/Attributes.scala | 22 + .../akka/stream/StreamRefExceptions.scala | 6 + .../scala/akka/stream/StreamRefSettings.scala | 52 + .../main/scala/akka/stream/StreamRefs.scala | 92 + .../main/scala/akka/stream/impl/Buffers.scala | 3 + .../main/scala/akka/stream/impl/Stages.scala | 1 + .../akka/stream/impl/fusing/GraphStages.scala | 85 + .../impl/streamref/MaterializedSinkRef.scala | 49 + .../streamref/MaterializedSourceRef.scala | 49 + .../stream/impl/streamref/SinkRefImpl.scala | 209 ++ .../stream/impl/streamref/SourceRefImpl.scala | 235 ++ .../streamref/StreamRefSettingsImpl.scala | 25 + .../impl/streamref/StreamRefsMaster.scala | 37 + .../impl/streamref/StreamRefsProtocol.scala | 57 + .../main/scala/akka/stream/javadsl/Sink.scala | 12 + .../scala/akka/stream/javadsl/Source.scala | 13 + .../scala/akka/stream/remote/StreamRefs.scala | 67 - .../stream/remote/impl/StreamRefsMaster.scala | 61 - .../akka/stream/remote/scaladsl/SinkRef.scala | 274 --- .../stream/remote/scaladsl/SourceRef.scala | 289 --- .../remote/scaladsl/StreamRefSettings.scala | 19 - .../serialization/StreamRefSerializer.scala | 160 -- .../scala/akka/stream/scaladsl/Sink.scala | 12 + .../scala/akka/stream/scaladsl/Source.scala | 20 +- .../serialization/StreamRefSerializer.scala | 187 ++ .../scala/akka/stream/stage/GraphStage.scala | 2 +- 42 files changed, 2834 insertions(+), 4386 deletions(-) delete mode 100644 akka-docs/src/main/java/docs/ddata/protobuf/msg/TwoPhaseSetMessages.java delete mode 100644 akka-docs/src/main/java/docs/persistence/proto/FlightAppModels.java create mode 100644 akka-docs/src/main/paradox/images/source-ref-animation.gif create mode 100644 akka-docs/src/main/paradox/stream/stream-refs.md create mode 100644 akka-docs/src/test/scala/docs/stream/FlowStreamRefsDocSpec.scala delete mode 100644 akka-stream-tests/src/test/scala/akka/stream/remote/StreamRefsSpec.scala create mode 100644 akka-stream-tests/src/test/scala/akka/stream/scaladsl/StreamRefsSpec.scala rename akka-stream/src/main/java/akka/stream/{remote/StreamRefContainers.java => StreamRefMessages.java} (70%) create mode 100644 akka-stream/src/main/mima-filters/2.5.10.backwards.excludes rename akka-stream/src/main/protobuf/{StreamRefContainers.proto => StreamRefMessages.proto} (59%) create mode 100644 akka-stream/src/main/scala/akka/stream/StreamRefExceptions.scala create mode 100644 akka-stream/src/main/scala/akka/stream/StreamRefSettings.scala create mode 100644 akka-stream/src/main/scala/akka/stream/StreamRefs.scala create mode 100644 akka-stream/src/main/scala/akka/stream/impl/streamref/MaterializedSinkRef.scala create mode 100644 akka-stream/src/main/scala/akka/stream/impl/streamref/MaterializedSourceRef.scala create mode 100644 akka-stream/src/main/scala/akka/stream/impl/streamref/SinkRefImpl.scala create mode 100644 akka-stream/src/main/scala/akka/stream/impl/streamref/SourceRefImpl.scala create mode 100644 akka-stream/src/main/scala/akka/stream/impl/streamref/StreamRefSettingsImpl.scala create mode 100644 akka-stream/src/main/scala/akka/stream/impl/streamref/StreamRefsMaster.scala create mode 100644 akka-stream/src/main/scala/akka/stream/impl/streamref/StreamRefsProtocol.scala delete mode 100644 akka-stream/src/main/scala/akka/stream/remote/StreamRefs.scala delete mode 100644 akka-stream/src/main/scala/akka/stream/remote/impl/StreamRefsMaster.scala delete mode 100644 akka-stream/src/main/scala/akka/stream/remote/scaladsl/SinkRef.scala delete mode 100644 akka-stream/src/main/scala/akka/stream/remote/scaladsl/SourceRef.scala delete mode 100644 akka-stream/src/main/scala/akka/stream/remote/scaladsl/StreamRefSettings.scala delete mode 100644 akka-stream/src/main/scala/akka/stream/remote/serialization/StreamRefSerializer.scala create mode 100644 akka-stream/src/main/scala/akka/stream/serialization/StreamRefSerializer.scala diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index 67531c7a24..80c7972bd7 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -9,12 +9,10 @@ import scala.util.control.NonFatal import scala.collection.immutable import akka.actor._ import akka.serialization.SerializationExtension -import akka.util.{ Helpers, Unsafe } +import akka.util.{ Unsafe, Helpers } import akka.serialization.SerializerWithStringManifest import java.util.Optional -import akka.event.Logging - private[akka] object Children { val GetNobody = () ⇒ Nobody } @@ -194,8 +192,7 @@ private[akka] trait Children { this: ActorCell ⇒ protected def getAllChildStats: immutable.Iterable[ChildRestartStats] = childrenRefs.stats - override def getSingleChild(name: String): InternalActorRef = { - + override def getSingleChild(name: String): InternalActorRef = if (name.indexOf('#') == -1) { // optimization for the non-uid case getChildByName(name) match { @@ -210,7 +207,6 @@ private[akka] trait Children { this: ActorCell ⇒ case _ ⇒ getFunctionRefOrNobody(childName, uid) } } - } protected def removeChildAndGetStateChange(child: ActorRef): Option[SuspendReason] = { @tailrec def removeChild(ref: ActorRef): ChildrenContainer = { diff --git a/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala b/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala index 0cac831339..90b105e28a 100644 --- a/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala +++ b/akka-actor/src/main/scala/akka/pattern/PipeToSupport.scala @@ -72,6 +72,7 @@ trait PipeToSupport { * * {{{ * import akka.pattern.pipe + * // requires implicit ExecutionContext, e.g. by importing `context.dispatcher` inside an Actor * * Future { doExpensiveCalc() } pipeTo nextActor * @@ -91,6 +92,7 @@ trait PipeToSupport { * * {{{ * import akka.pattern.pipe + * // requires implicit ExecutionContext, e.g. by importing `context.dispatcher` inside an Actor * * Future { doExpensiveCalc() } pipeTo nextActor * diff --git a/akka-docs/src/main/java/docs/ddata/protobuf/msg/TwoPhaseSetMessages.java b/akka-docs/src/main/java/docs/ddata/protobuf/msg/TwoPhaseSetMessages.java deleted file mode 100644 index e882dbfd57..0000000000 --- a/akka-docs/src/main/java/docs/ddata/protobuf/msg/TwoPhaseSetMessages.java +++ /dev/null @@ -1,1236 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: TwoPhaseSetMessages.proto - -package docs.ddata.protobuf.msg; - -public final class TwoPhaseSetMessages { - private TwoPhaseSetMessages() {} - public static void registerAllExtensions( - akka.protobuf.ExtensionRegistry registry) { - } - public interface TwoPhaseSetOrBuilder - extends akka.protobuf.MessageOrBuilder { - - // repeated string adds = 1; - /** - * repeated string adds = 1; - */ - java.util.List - getAddsList(); - /** - * repeated string adds = 1; - */ - int getAddsCount(); - /** - * repeated string adds = 1; - */ - java.lang.String getAdds(int index); - /** - * repeated string adds = 1; - */ - akka.protobuf.ByteString - getAddsBytes(int index); - - // repeated string removals = 2; - /** - * repeated string removals = 2; - */ - java.util.List - getRemovalsList(); - /** - * repeated string removals = 2; - */ - int getRemovalsCount(); - /** - * repeated string removals = 2; - */ - java.lang.String getRemovals(int index); - /** - * repeated string removals = 2; - */ - akka.protobuf.ByteString - getRemovalsBytes(int index); - } - /** - * Protobuf type {@code docs.ddata.TwoPhaseSet} - */ - public static final class TwoPhaseSet extends - akka.protobuf.GeneratedMessage - implements TwoPhaseSetOrBuilder { - // Use TwoPhaseSet.newBuilder() to construct. - private TwoPhaseSet(akka.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private TwoPhaseSet(boolean noInit) { this.unknownFields = akka.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final TwoPhaseSet defaultInstance; - public static TwoPhaseSet getDefaultInstance() { - return defaultInstance; - } - - public TwoPhaseSet getDefaultInstanceForType() { - return defaultInstance; - } - - private final akka.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final akka.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private TwoPhaseSet( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - akka.protobuf.UnknownFieldSet.Builder unknownFields = - akka.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - if (!((mutable_bitField0_ & 0x00000001) == 0x00000001)) { - adds_ = new akka.protobuf.LazyStringArrayList(); - mutable_bitField0_ |= 0x00000001; - } - adds_.add(input.readBytes()); - break; - } - case 18: { - if (!((mutable_bitField0_ & 0x00000002) == 0x00000002)) { - removals_ = new akka.protobuf.LazyStringArrayList(); - mutable_bitField0_ |= 0x00000002; - } - removals_.add(input.readBytes()); - break; - } - } - } - } catch (akka.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new akka.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - if (((mutable_bitField0_ & 0x00000001) == 0x00000001)) { - adds_ = new akka.protobuf.UnmodifiableLazyStringList(adds_); - } - if (((mutable_bitField0_ & 0x00000002) == 0x00000002)) { - removals_ = new akka.protobuf.UnmodifiableLazyStringList(removals_); - } - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final akka.protobuf.Descriptors.Descriptor - getDescriptor() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet_descriptor; - } - - protected akka.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet_fieldAccessorTable - .ensureFieldAccessorsInitialized( - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet.class, docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet.Builder.class); - } - - public static akka.protobuf.Parser PARSER = - new akka.protobuf.AbstractParser() { - public TwoPhaseSet parsePartialFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return new TwoPhaseSet(input, extensionRegistry); - } - }; - - @java.lang.Override - public akka.protobuf.Parser getParserForType() { - return PARSER; - } - - // repeated string adds = 1; - public static final int ADDS_FIELD_NUMBER = 1; - private akka.protobuf.LazyStringList adds_; - /** - * repeated string adds = 1; - */ - public java.util.List - getAddsList() { - return adds_; - } - /** - * repeated string adds = 1; - */ - public int getAddsCount() { - return adds_.size(); - } - /** - * repeated string adds = 1; - */ - public java.lang.String getAdds(int index) { - return adds_.get(index); - } - /** - * repeated string adds = 1; - */ - public akka.protobuf.ByteString - getAddsBytes(int index) { - return adds_.getByteString(index); - } - - // repeated string removals = 2; - public static final int REMOVALS_FIELD_NUMBER = 2; - private akka.protobuf.LazyStringList removals_; - /** - * repeated string removals = 2; - */ - public java.util.List - getRemovalsList() { - return removals_; - } - /** - * repeated string removals = 2; - */ - public int getRemovalsCount() { - return removals_.size(); - } - /** - * repeated string removals = 2; - */ - public java.lang.String getRemovals(int index) { - return removals_.get(index); - } - /** - * repeated string removals = 2; - */ - public akka.protobuf.ByteString - getRemovalsBytes(int index) { - return removals_.getByteString(index); - } - - private void initFields() { - adds_ = akka.protobuf.LazyStringArrayList.EMPTY; - removals_ = akka.protobuf.LazyStringArrayList.EMPTY; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(akka.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - for (int i = 0; i < adds_.size(); i++) { - output.writeBytes(1, adds_.getByteString(i)); - } - for (int i = 0; i < removals_.size(); i++) { - output.writeBytes(2, removals_.getByteString(i)); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - { - int dataSize = 0; - for (int i = 0; i < adds_.size(); i++) { - dataSize += akka.protobuf.CodedOutputStream - .computeBytesSizeNoTag(adds_.getByteString(i)); - } - size += dataSize; - size += 1 * getAddsList().size(); - } - { - int dataSize = 0; - for (int i = 0; i < removals_.size(); i++) { - dataSize += akka.protobuf.CodedOutputStream - .computeBytesSizeNoTag(removals_.getByteString(i)); - } - size += dataSize; - size += 1 * getRemovalsList().size(); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom( - akka.protobuf.ByteString data) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom( - akka.protobuf.ByteString data, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom(byte[] data) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom( - byte[] data, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom( - java.io.InputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseDelimitedFrom( - java.io.InputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom( - akka.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parseFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - akka.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code docs.ddata.TwoPhaseSet} - */ - public static final class Builder extends - akka.protobuf.GeneratedMessage.Builder - implements docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSetOrBuilder { - public static final akka.protobuf.Descriptors.Descriptor - getDescriptor() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet_descriptor; - } - - protected akka.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet_fieldAccessorTable - .ensureFieldAccessorsInitialized( - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet.class, docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet.Builder.class); - } - - // Construct using docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - akka.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (akka.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - adds_ = akka.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000001); - removals_ = akka.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000002); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public akka.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet_descriptor; - } - - public docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet getDefaultInstanceForType() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet.getDefaultInstance(); - } - - public docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet build() { - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet buildPartial() { - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet result = new docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet(this); - int from_bitField0_ = bitField0_; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - adds_ = new akka.protobuf.UnmodifiableLazyStringList( - adds_); - bitField0_ = (bitField0_ & ~0x00000001); - } - result.adds_ = adds_; - if (((bitField0_ & 0x00000002) == 0x00000002)) { - removals_ = new akka.protobuf.UnmodifiableLazyStringList( - removals_); - bitField0_ = (bitField0_ & ~0x00000002); - } - result.removals_ = removals_; - onBuilt(); - return result; - } - - public Builder mergeFrom(akka.protobuf.Message other) { - if (other instanceof docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet) { - return mergeFrom((docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet other) { - if (other == docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet.getDefaultInstance()) return this; - if (!other.adds_.isEmpty()) { - if (adds_.isEmpty()) { - adds_ = other.adds_; - bitField0_ = (bitField0_ & ~0x00000001); - } else { - ensureAddsIsMutable(); - adds_.addAll(other.adds_); - } - onChanged(); - } - if (!other.removals_.isEmpty()) { - if (removals_.isEmpty()) { - removals_ = other.removals_; - bitField0_ = (bitField0_ & ~0x00000002); - } else { - ensureRemovalsIsMutable(); - removals_.addAll(other.removals_); - } - onChanged(); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (akka.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // repeated string adds = 1; - private akka.protobuf.LazyStringList adds_ = akka.protobuf.LazyStringArrayList.EMPTY; - private void ensureAddsIsMutable() { - if (!((bitField0_ & 0x00000001) == 0x00000001)) { - adds_ = new akka.protobuf.LazyStringArrayList(adds_); - bitField0_ |= 0x00000001; - } - } - /** - * repeated string adds = 1; - */ - public java.util.List - getAddsList() { - return java.util.Collections.unmodifiableList(adds_); - } - /** - * repeated string adds = 1; - */ - public int getAddsCount() { - return adds_.size(); - } - /** - * repeated string adds = 1; - */ - public java.lang.String getAdds(int index) { - return adds_.get(index); - } - /** - * repeated string adds = 1; - */ - public akka.protobuf.ByteString - getAddsBytes(int index) { - return adds_.getByteString(index); - } - /** - * repeated string adds = 1; - */ - public Builder setAdds( - int index, java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - ensureAddsIsMutable(); - adds_.set(index, value); - onChanged(); - return this; - } - /** - * repeated string adds = 1; - */ - public Builder addAdds( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - ensureAddsIsMutable(); - adds_.add(value); - onChanged(); - return this; - } - /** - * repeated string adds = 1; - */ - public Builder addAllAdds( - java.lang.Iterable values) { - ensureAddsIsMutable(); - super.addAll(values, adds_); - onChanged(); - return this; - } - /** - * repeated string adds = 1; - */ - public Builder clearAdds() { - adds_ = akka.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000001); - onChanged(); - return this; - } - /** - * repeated string adds = 1; - */ - public Builder addAddsBytes( - akka.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - ensureAddsIsMutable(); - adds_.add(value); - onChanged(); - return this; - } - - // repeated string removals = 2; - private akka.protobuf.LazyStringList removals_ = akka.protobuf.LazyStringArrayList.EMPTY; - private void ensureRemovalsIsMutable() { - if (!((bitField0_ & 0x00000002) == 0x00000002)) { - removals_ = new akka.protobuf.LazyStringArrayList(removals_); - bitField0_ |= 0x00000002; - } - } - /** - * repeated string removals = 2; - */ - public java.util.List - getRemovalsList() { - return java.util.Collections.unmodifiableList(removals_); - } - /** - * repeated string removals = 2; - */ - public int getRemovalsCount() { - return removals_.size(); - } - /** - * repeated string removals = 2; - */ - public java.lang.String getRemovals(int index) { - return removals_.get(index); - } - /** - * repeated string removals = 2; - */ - public akka.protobuf.ByteString - getRemovalsBytes(int index) { - return removals_.getByteString(index); - } - /** - * repeated string removals = 2; - */ - public Builder setRemovals( - int index, java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - ensureRemovalsIsMutable(); - removals_.set(index, value); - onChanged(); - return this; - } - /** - * repeated string removals = 2; - */ - public Builder addRemovals( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - ensureRemovalsIsMutable(); - removals_.add(value); - onChanged(); - return this; - } - /** - * repeated string removals = 2; - */ - public Builder addAllRemovals( - java.lang.Iterable values) { - ensureRemovalsIsMutable(); - super.addAll(values, removals_); - onChanged(); - return this; - } - /** - * repeated string removals = 2; - */ - public Builder clearRemovals() { - removals_ = akka.protobuf.LazyStringArrayList.EMPTY; - bitField0_ = (bitField0_ & ~0x00000002); - onChanged(); - return this; - } - /** - * repeated string removals = 2; - */ - public Builder addRemovalsBytes( - akka.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - ensureRemovalsIsMutable(); - removals_.add(value); - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:docs.ddata.TwoPhaseSet) - } - - static { - defaultInstance = new TwoPhaseSet(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:docs.ddata.TwoPhaseSet) - } - - public interface TwoPhaseSet2OrBuilder - extends akka.protobuf.MessageOrBuilder { - - // optional bytes adds = 1; - /** - * optional bytes adds = 1; - */ - boolean hasAdds(); - /** - * optional bytes adds = 1; - */ - akka.protobuf.ByteString getAdds(); - - // optional bytes removals = 2; - /** - * optional bytes removals = 2; - */ - boolean hasRemovals(); - /** - * optional bytes removals = 2; - */ - akka.protobuf.ByteString getRemovals(); - } - /** - * Protobuf type {@code docs.ddata.TwoPhaseSet2} - * - *
-   *#twophaseset2
-   * 
- */ - public static final class TwoPhaseSet2 extends - akka.protobuf.GeneratedMessage - implements TwoPhaseSet2OrBuilder { - // Use TwoPhaseSet2.newBuilder() to construct. - private TwoPhaseSet2(akka.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private TwoPhaseSet2(boolean noInit) { this.unknownFields = akka.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final TwoPhaseSet2 defaultInstance; - public static TwoPhaseSet2 getDefaultInstance() { - return defaultInstance; - } - - public TwoPhaseSet2 getDefaultInstanceForType() { - return defaultInstance; - } - - private final akka.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final akka.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private TwoPhaseSet2( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - akka.protobuf.UnknownFieldSet.Builder unknownFields = - akka.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - bitField0_ |= 0x00000001; - adds_ = input.readBytes(); - break; - } - case 18: { - bitField0_ |= 0x00000002; - removals_ = input.readBytes(); - break; - } - } - } - } catch (akka.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new akka.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final akka.protobuf.Descriptors.Descriptor - getDescriptor() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet2_descriptor; - } - - protected akka.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet2_fieldAccessorTable - .ensureFieldAccessorsInitialized( - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2.class, docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2.Builder.class); - } - - public static akka.protobuf.Parser PARSER = - new akka.protobuf.AbstractParser() { - public TwoPhaseSet2 parsePartialFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return new TwoPhaseSet2(input, extensionRegistry); - } - }; - - @java.lang.Override - public akka.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // optional bytes adds = 1; - public static final int ADDS_FIELD_NUMBER = 1; - private akka.protobuf.ByteString adds_; - /** - * optional bytes adds = 1; - */ - public boolean hasAdds() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * optional bytes adds = 1; - */ - public akka.protobuf.ByteString getAdds() { - return adds_; - } - - // optional bytes removals = 2; - public static final int REMOVALS_FIELD_NUMBER = 2; - private akka.protobuf.ByteString removals_; - /** - * optional bytes removals = 2; - */ - public boolean hasRemovals() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional bytes removals = 2; - */ - public akka.protobuf.ByteString getRemovals() { - return removals_; - } - - private void initFields() { - adds_ = akka.protobuf.ByteString.EMPTY; - removals_ = akka.protobuf.ByteString.EMPTY; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(akka.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, adds_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeBytes(2, removals_); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += akka.protobuf.CodedOutputStream - .computeBytesSize(1, adds_); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += akka.protobuf.CodedOutputStream - .computeBytesSize(2, removals_); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom( - akka.protobuf.ByteString data) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom( - akka.protobuf.ByteString data, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom(byte[] data) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom( - byte[] data, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom( - java.io.InputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseDelimitedFrom( - java.io.InputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom( - akka.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parseFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - akka.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code docs.ddata.TwoPhaseSet2} - * - *
-     *#twophaseset2
-     * 
- */ - public static final class Builder extends - akka.protobuf.GeneratedMessage.Builder - implements docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2OrBuilder { - public static final akka.protobuf.Descriptors.Descriptor - getDescriptor() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet2_descriptor; - } - - protected akka.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet2_fieldAccessorTable - .ensureFieldAccessorsInitialized( - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2.class, docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2.Builder.class); - } - - // Construct using docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - akka.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (akka.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - adds_ = akka.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000001); - removals_ = akka.protobuf.ByteString.EMPTY; - bitField0_ = (bitField0_ & ~0x00000002); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public akka.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.internal_static_docs_ddata_TwoPhaseSet2_descriptor; - } - - public docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 getDefaultInstanceForType() { - return docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2.getDefaultInstance(); - } - - public docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 build() { - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 buildPartial() { - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 result = new docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.adds_ = adds_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.removals_ = removals_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(akka.protobuf.Message other) { - if (other instanceof docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2) { - return mergeFrom((docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 other) { - if (other == docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2.getDefaultInstance()) return this; - if (other.hasAdds()) { - setAdds(other.getAdds()); - } - if (other.hasRemovals()) { - setRemovals(other.getRemovals()); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - return true; - } - - public Builder mergeFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2 parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (akka.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (docs.ddata.protobuf.msg.TwoPhaseSetMessages.TwoPhaseSet2) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // optional bytes adds = 1; - private akka.protobuf.ByteString adds_ = akka.protobuf.ByteString.EMPTY; - /** - * optional bytes adds = 1; - */ - public boolean hasAdds() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * optional bytes adds = 1; - */ - public akka.protobuf.ByteString getAdds() { - return adds_; - } - /** - * optional bytes adds = 1; - */ - public Builder setAdds(akka.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - adds_ = value; - onChanged(); - return this; - } - /** - * optional bytes adds = 1; - */ - public Builder clearAdds() { - bitField0_ = (bitField0_ & ~0x00000001); - adds_ = getDefaultInstance().getAdds(); - onChanged(); - return this; - } - - // optional bytes removals = 2; - private akka.protobuf.ByteString removals_ = akka.protobuf.ByteString.EMPTY; - /** - * optional bytes removals = 2; - */ - public boolean hasRemovals() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional bytes removals = 2; - */ - public akka.protobuf.ByteString getRemovals() { - return removals_; - } - /** - * optional bytes removals = 2; - */ - public Builder setRemovals(akka.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000002; - removals_ = value; - onChanged(); - return this; - } - /** - * optional bytes removals = 2; - */ - public Builder clearRemovals() { - bitField0_ = (bitField0_ & ~0x00000002); - removals_ = getDefaultInstance().getRemovals(); - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:docs.ddata.TwoPhaseSet2) - } - - static { - defaultInstance = new TwoPhaseSet2(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:docs.ddata.TwoPhaseSet2) - } - - private static akka.protobuf.Descriptors.Descriptor - internal_static_docs_ddata_TwoPhaseSet_descriptor; - private static - akka.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_docs_ddata_TwoPhaseSet_fieldAccessorTable; - private static akka.protobuf.Descriptors.Descriptor - internal_static_docs_ddata_TwoPhaseSet2_descriptor; - private static - akka.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_docs_ddata_TwoPhaseSet2_fieldAccessorTable; - - public static akka.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static akka.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\031TwoPhaseSetMessages.proto\022\ndocs.ddata\"" + - "-\n\013TwoPhaseSet\022\014\n\004adds\030\001 \003(\t\022\020\n\010removals" + - "\030\002 \003(\t\".\n\014TwoPhaseSet2\022\014\n\004adds\030\001 \001(\014\022\020\n\010" + - "removals\030\002 \001(\014B\033\n\027docs.ddata.protobuf.ms" + - "gH\001" - }; - akka.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new akka.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public akka.protobuf.ExtensionRegistry assignDescriptors( - akka.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_docs_ddata_TwoPhaseSet_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_docs_ddata_TwoPhaseSet_fieldAccessorTable = new - akka.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_docs_ddata_TwoPhaseSet_descriptor, - new java.lang.String[] { "Adds", "Removals", }); - internal_static_docs_ddata_TwoPhaseSet2_descriptor = - getDescriptor().getMessageTypes().get(1); - internal_static_docs_ddata_TwoPhaseSet2_fieldAccessorTable = new - akka.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_docs_ddata_TwoPhaseSet2_descriptor, - new java.lang.String[] { "Adds", "Removals", }); - return null; - } - }; - akka.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new akka.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/akka-docs/src/main/java/docs/persistence/proto/FlightAppModels.java b/akka-docs/src/main/java/docs/persistence/proto/FlightAppModels.java deleted file mode 100644 index 456eaff742..0000000000 --- a/akka-docs/src/main/java/docs/persistence/proto/FlightAppModels.java +++ /dev/null @@ -1,823 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: FlightAppModels.proto - -package docs.persistence.proto; - -public final class FlightAppModels { - private FlightAppModels() {} - public static void registerAllExtensions( - akka.protobuf.ExtensionRegistry registry) { - } - public interface SeatReservedOrBuilder - extends akka.protobuf.MessageOrBuilder { - - // required string letter = 1; - /** - * required string letter = 1; - */ - boolean hasLetter(); - /** - * required string letter = 1; - */ - java.lang.String getLetter(); - /** - * required string letter = 1; - */ - akka.protobuf.ByteString - getLetterBytes(); - - // required uint32 row = 2; - /** - * required uint32 row = 2; - */ - boolean hasRow(); - /** - * required uint32 row = 2; - */ - int getRow(); - - // optional string seatType = 3; - /** - * optional string seatType = 3; - * - *
-     * the new field
-     * 
- */ - boolean hasSeatType(); - /** - * optional string seatType = 3; - * - *
-     * the new field
-     * 
- */ - java.lang.String getSeatType(); - /** - * optional string seatType = 3; - * - *
-     * the new field
-     * 
- */ - akka.protobuf.ByteString - getSeatTypeBytes(); - } - /** - * Protobuf type {@code docs.persistence.SeatReserved} - */ - public static final class SeatReserved extends - akka.protobuf.GeneratedMessage - implements SeatReservedOrBuilder { - // Use SeatReserved.newBuilder() to construct. - private SeatReserved(akka.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private SeatReserved(boolean noInit) { this.unknownFields = akka.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final SeatReserved defaultInstance; - public static SeatReserved getDefaultInstance() { - return defaultInstance; - } - - public SeatReserved getDefaultInstanceForType() { - return defaultInstance; - } - - private final akka.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final akka.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private SeatReserved( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - akka.protobuf.UnknownFieldSet.Builder unknownFields = - akka.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - bitField0_ |= 0x00000001; - letter_ = input.readBytes(); - break; - } - case 16: { - bitField0_ |= 0x00000002; - row_ = input.readUInt32(); - break; - } - case 26: { - bitField0_ |= 0x00000004; - seatType_ = input.readBytes(); - break; - } - } - } - } catch (akka.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new akka.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final akka.protobuf.Descriptors.Descriptor - getDescriptor() { - return docs.persistence.proto.FlightAppModels.internal_static_docs_persistence_SeatReserved_descriptor; - } - - protected akka.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return docs.persistence.proto.FlightAppModels.internal_static_docs_persistence_SeatReserved_fieldAccessorTable - .ensureFieldAccessorsInitialized( - docs.persistence.proto.FlightAppModels.SeatReserved.class, docs.persistence.proto.FlightAppModels.SeatReserved.Builder.class); - } - - public static akka.protobuf.Parser PARSER = - new akka.protobuf.AbstractParser() { - public SeatReserved parsePartialFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return new SeatReserved(input, extensionRegistry); - } - }; - - @java.lang.Override - public akka.protobuf.Parser getParserForType() { - return PARSER; - } - - private int bitField0_; - // required string letter = 1; - public static final int LETTER_FIELD_NUMBER = 1; - private java.lang.Object letter_; - /** - * required string letter = 1; - */ - public boolean hasLetter() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required string letter = 1; - */ - public java.lang.String getLetter() { - java.lang.Object ref = letter_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - akka.protobuf.ByteString bs = - (akka.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - letter_ = s; - } - return s; - } - } - /** - * required string letter = 1; - */ - public akka.protobuf.ByteString - getLetterBytes() { - java.lang.Object ref = letter_; - if (ref instanceof java.lang.String) { - akka.protobuf.ByteString b = - akka.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - letter_ = b; - return b; - } else { - return (akka.protobuf.ByteString) ref; - } - } - - // required uint32 row = 2; - public static final int ROW_FIELD_NUMBER = 2; - private int row_; - /** - * required uint32 row = 2; - */ - public boolean hasRow() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * required uint32 row = 2; - */ - public int getRow() { - return row_; - } - - // optional string seatType = 3; - public static final int SEATTYPE_FIELD_NUMBER = 3; - private java.lang.Object seatType_; - /** - * optional string seatType = 3; - * - *
-     * the new field
-     * 
- */ - public boolean hasSeatType() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional string seatType = 3; - * - *
-     * the new field
-     * 
- */ - public java.lang.String getSeatType() { - java.lang.Object ref = seatType_; - if (ref instanceof java.lang.String) { - return (java.lang.String) ref; - } else { - akka.protobuf.ByteString bs = - (akka.protobuf.ByteString) ref; - java.lang.String s = bs.toStringUtf8(); - if (bs.isValidUtf8()) { - seatType_ = s; - } - return s; - } - } - /** - * optional string seatType = 3; - * - *
-     * the new field
-     * 
- */ - public akka.protobuf.ByteString - getSeatTypeBytes() { - java.lang.Object ref = seatType_; - if (ref instanceof java.lang.String) { - akka.protobuf.ByteString b = - akka.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - seatType_ = b; - return b; - } else { - return (akka.protobuf.ByteString) ref; - } - } - - private void initFields() { - letter_ = ""; - row_ = 0; - seatType_ = ""; - } - private byte memoizedIsInitialized = -1; - public final boolean isInitialized() { - byte isInitialized = memoizedIsInitialized; - if (isInitialized != -1) return isInitialized == 1; - - if (!hasLetter()) { - memoizedIsInitialized = 0; - return false; - } - if (!hasRow()) { - memoizedIsInitialized = 0; - return false; - } - memoizedIsInitialized = 1; - return true; - } - - public void writeTo(akka.protobuf.CodedOutputStream output) - throws java.io.IOException { - getSerializedSize(); - if (((bitField0_ & 0x00000001) == 0x00000001)) { - output.writeBytes(1, getLetterBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeUInt32(2, row_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - output.writeBytes(3, getSeatTypeBytes()); - } - getUnknownFields().writeTo(output); - } - - private int memoizedSerializedSize = -1; - public int getSerializedSize() { - int size = memoizedSerializedSize; - if (size != -1) return size; - - size = 0; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - size += akka.protobuf.CodedOutputStream - .computeBytesSize(1, getLetterBytes()); - } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += akka.protobuf.CodedOutputStream - .computeUInt32Size(2, row_); - } - if (((bitField0_ & 0x00000004) == 0x00000004)) { - size += akka.protobuf.CodedOutputStream - .computeBytesSize(3, getSeatTypeBytes()); - } - size += getUnknownFields().getSerializedSize(); - memoizedSerializedSize = size; - return size; - } - - private static final long serialVersionUID = 0L; - @java.lang.Override - protected java.lang.Object writeReplace() - throws java.io.ObjectStreamException { - return super.writeReplace(); - } - - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom( - akka.protobuf.ByteString data) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom( - akka.protobuf.ByteString data, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom(byte[] data) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom( - byte[] data, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - return PARSER.parseFrom(data, extensionRegistry); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom( - java.io.InputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseDelimitedFrom(java.io.InputStream input) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseDelimitedFrom( - java.io.InputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseDelimitedFrom(input, extensionRegistry); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom( - akka.protobuf.CodedInputStream input) - throws java.io.IOException { - return PARSER.parseFrom(input); - } - public static docs.persistence.proto.FlightAppModels.SeatReserved parseFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - return PARSER.parseFrom(input, extensionRegistry); - } - - public static Builder newBuilder() { return Builder.create(); } - public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(docs.persistence.proto.FlightAppModels.SeatReserved prototype) { - return newBuilder().mergeFrom(prototype); - } - public Builder toBuilder() { return newBuilder(this); } - - @java.lang.Override - protected Builder newBuilderForType( - akka.protobuf.GeneratedMessage.BuilderParent parent) { - Builder builder = new Builder(parent); - return builder; - } - /** - * Protobuf type {@code docs.persistence.SeatReserved} - */ - public static final class Builder extends - akka.protobuf.GeneratedMessage.Builder - implements docs.persistence.proto.FlightAppModels.SeatReservedOrBuilder { - public static final akka.protobuf.Descriptors.Descriptor - getDescriptor() { - return docs.persistence.proto.FlightAppModels.internal_static_docs_persistence_SeatReserved_descriptor; - } - - protected akka.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return docs.persistence.proto.FlightAppModels.internal_static_docs_persistence_SeatReserved_fieldAccessorTable - .ensureFieldAccessorsInitialized( - docs.persistence.proto.FlightAppModels.SeatReserved.class, docs.persistence.proto.FlightAppModels.SeatReserved.Builder.class); - } - - // Construct using docs.persistence.proto.FlightAppModels.SeatReserved.newBuilder() - private Builder() { - maybeForceBuilderInitialization(); - } - - private Builder( - akka.protobuf.GeneratedMessage.BuilderParent parent) { - super(parent); - maybeForceBuilderInitialization(); - } - private void maybeForceBuilderInitialization() { - if (akka.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { - } - } - private static Builder create() { - return new Builder(); - } - - public Builder clear() { - super.clear(); - letter_ = ""; - bitField0_ = (bitField0_ & ~0x00000001); - row_ = 0; - bitField0_ = (bitField0_ & ~0x00000002); - seatType_ = ""; - bitField0_ = (bitField0_ & ~0x00000004); - return this; - } - - public Builder clone() { - return create().mergeFrom(buildPartial()); - } - - public akka.protobuf.Descriptors.Descriptor - getDescriptorForType() { - return docs.persistence.proto.FlightAppModels.internal_static_docs_persistence_SeatReserved_descriptor; - } - - public docs.persistence.proto.FlightAppModels.SeatReserved getDefaultInstanceForType() { - return docs.persistence.proto.FlightAppModels.SeatReserved.getDefaultInstance(); - } - - public docs.persistence.proto.FlightAppModels.SeatReserved build() { - docs.persistence.proto.FlightAppModels.SeatReserved result = buildPartial(); - if (!result.isInitialized()) { - throw newUninitializedMessageException(result); - } - return result; - } - - public docs.persistence.proto.FlightAppModels.SeatReserved buildPartial() { - docs.persistence.proto.FlightAppModels.SeatReserved result = new docs.persistence.proto.FlightAppModels.SeatReserved(this); - int from_bitField0_ = bitField0_; - int to_bitField0_ = 0; - if (((from_bitField0_ & 0x00000001) == 0x00000001)) { - to_bitField0_ |= 0x00000001; - } - result.letter_ = letter_; - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.row_ = row_; - if (((from_bitField0_ & 0x00000004) == 0x00000004)) { - to_bitField0_ |= 0x00000004; - } - result.seatType_ = seatType_; - result.bitField0_ = to_bitField0_; - onBuilt(); - return result; - } - - public Builder mergeFrom(akka.protobuf.Message other) { - if (other instanceof docs.persistence.proto.FlightAppModels.SeatReserved) { - return mergeFrom((docs.persistence.proto.FlightAppModels.SeatReserved)other); - } else { - super.mergeFrom(other); - return this; - } - } - - public Builder mergeFrom(docs.persistence.proto.FlightAppModels.SeatReserved other) { - if (other == docs.persistence.proto.FlightAppModels.SeatReserved.getDefaultInstance()) return this; - if (other.hasLetter()) { - bitField0_ |= 0x00000001; - letter_ = other.letter_; - onChanged(); - } - if (other.hasRow()) { - setRow(other.getRow()); - } - if (other.hasSeatType()) { - bitField0_ |= 0x00000004; - seatType_ = other.seatType_; - onChanged(); - } - this.mergeUnknownFields(other.getUnknownFields()); - return this; - } - - public final boolean isInitialized() { - if (!hasLetter()) { - - return false; - } - if (!hasRow()) { - - return false; - } - return true; - } - - public Builder mergeFrom( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws java.io.IOException { - docs.persistence.proto.FlightAppModels.SeatReserved parsedMessage = null; - try { - parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); - } catch (akka.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (docs.persistence.proto.FlightAppModels.SeatReserved) e.getUnfinishedMessage(); - throw e; - } finally { - if (parsedMessage != null) { - mergeFrom(parsedMessage); - } - } - return this; - } - private int bitField0_; - - // required string letter = 1; - private java.lang.Object letter_ = ""; - /** - * required string letter = 1; - */ - public boolean hasLetter() { - return ((bitField0_ & 0x00000001) == 0x00000001); - } - /** - * required string letter = 1; - */ - public java.lang.String getLetter() { - java.lang.Object ref = letter_; - if (!(ref instanceof java.lang.String)) { - java.lang.String s = ((akka.protobuf.ByteString) ref) - .toStringUtf8(); - letter_ = s; - return s; - } else { - return (java.lang.String) ref; - } - } - /** - * required string letter = 1; - */ - public akka.protobuf.ByteString - getLetterBytes() { - java.lang.Object ref = letter_; - if (ref instanceof String) { - akka.protobuf.ByteString b = - akka.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - letter_ = b; - return b; - } else { - return (akka.protobuf.ByteString) ref; - } - } - /** - * required string letter = 1; - */ - public Builder setLetter( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - letter_ = value; - onChanged(); - return this; - } - /** - * required string letter = 1; - */ - public Builder clearLetter() { - bitField0_ = (bitField0_ & ~0x00000001); - letter_ = getDefaultInstance().getLetter(); - onChanged(); - return this; - } - /** - * required string letter = 1; - */ - public Builder setLetterBytes( - akka.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000001; - letter_ = value; - onChanged(); - return this; - } - - // required uint32 row = 2; - private int row_ ; - /** - * required uint32 row = 2; - */ - public boolean hasRow() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * required uint32 row = 2; - */ - public int getRow() { - return row_; - } - /** - * required uint32 row = 2; - */ - public Builder setRow(int value) { - bitField0_ |= 0x00000002; - row_ = value; - onChanged(); - return this; - } - /** - * required uint32 row = 2; - */ - public Builder clearRow() { - bitField0_ = (bitField0_ & ~0x00000002); - row_ = 0; - onChanged(); - return this; - } - - // optional string seatType = 3; - private java.lang.Object seatType_ = ""; - /** - * optional string seatType = 3; - * - *
-       * the new field
-       * 
- */ - public boolean hasSeatType() { - return ((bitField0_ & 0x00000004) == 0x00000004); - } - /** - * optional string seatType = 3; - * - *
-       * the new field
-       * 
- */ - public java.lang.String getSeatType() { - java.lang.Object ref = seatType_; - if (!(ref instanceof java.lang.String)) { - java.lang.String s = ((akka.protobuf.ByteString) ref) - .toStringUtf8(); - seatType_ = s; - return s; - } else { - return (java.lang.String) ref; - } - } - /** - * optional string seatType = 3; - * - *
-       * the new field
-       * 
- */ - public akka.protobuf.ByteString - getSeatTypeBytes() { - java.lang.Object ref = seatType_; - if (ref instanceof String) { - akka.protobuf.ByteString b = - akka.protobuf.ByteString.copyFromUtf8( - (java.lang.String) ref); - seatType_ = b; - return b; - } else { - return (akka.protobuf.ByteString) ref; - } - } - /** - * optional string seatType = 3; - * - *
-       * the new field
-       * 
- */ - public Builder setSeatType( - java.lang.String value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000004; - seatType_ = value; - onChanged(); - return this; - } - /** - * optional string seatType = 3; - * - *
-       * the new field
-       * 
- */ - public Builder clearSeatType() { - bitField0_ = (bitField0_ & ~0x00000004); - seatType_ = getDefaultInstance().getSeatType(); - onChanged(); - return this; - } - /** - * optional string seatType = 3; - * - *
-       * the new field
-       * 
- */ - public Builder setSeatTypeBytes( - akka.protobuf.ByteString value) { - if (value == null) { - throw new NullPointerException(); - } - bitField0_ |= 0x00000004; - seatType_ = value; - onChanged(); - return this; - } - - // @@protoc_insertion_point(builder_scope:docs.persistence.SeatReserved) - } - - static { - defaultInstance = new SeatReserved(true); - defaultInstance.initFields(); - } - - // @@protoc_insertion_point(class_scope:docs.persistence.SeatReserved) - } - - private static akka.protobuf.Descriptors.Descriptor - internal_static_docs_persistence_SeatReserved_descriptor; - private static - akka.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_docs_persistence_SeatReserved_fieldAccessorTable; - - public static akka.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; - } - private static akka.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\025FlightAppModels.proto\022\020docs.persistenc" + - "e\"=\n\014SeatReserved\022\016\n\006letter\030\001 \002(\t\022\013\n\003row" + - "\030\002 \002(\r\022\020\n\010seatType\030\003 \001(\tB\032\n\026docs.persist" + - "ence.protoH\001" - }; - akka.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = - new akka.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { - public akka.protobuf.ExtensionRegistry assignDescriptors( - akka.protobuf.Descriptors.FileDescriptor root) { - descriptor = root; - internal_static_docs_persistence_SeatReserved_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_docs_persistence_SeatReserved_fieldAccessorTable = new - akka.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_docs_persistence_SeatReserved_descriptor, - new java.lang.String[] { "Letter", "Row", "SeatType", }); - return null; - } - }; - akka.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new akka.protobuf.Descriptors.FileDescriptor[] { - }, assigner); - } - - // @@protoc_insertion_point(outer_class_scope) -} diff --git a/akka-docs/src/main/paradox/images/source-ref-animation.gif b/akka-docs/src/main/paradox/images/source-ref-animation.gif new file mode 100644 index 0000000000000000000000000000000000000000..897ed8814601da1fda4ecb9e885cc67ea5a52811 GIT binary patch literal 79177 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 literal 0 HcmV?d00001 diff --git a/akka-docs/src/main/paradox/stream/index.md b/akka-docs/src/main/paradox/stream/index.md index 93be480114..9aa4aca3ef 100644 --- a/akka-docs/src/main/paradox/stream/index.md +++ b/akka-docs/src/main/paradox/stream/index.md @@ -16,6 +16,7 @@ * [stream-integrations](stream-integrations.md) * [stream-error](stream-error.md) * [stream-io](stream-io.md) +* [stream-refs](stream-refs.md) * [stream-parallelism](stream-parallelism.md) * [stream-testkit](stream-testkit.md) * [stages-overview](stages-overview.md) diff --git a/akka-docs/src/main/paradox/stream/stream-refs.md b/akka-docs/src/main/paradox/stream/stream-refs.md new file mode 100644 index 0000000000..90f1a35b79 --- /dev/null +++ b/akka-docs/src/main/paradox/stream/stream-refs.md @@ -0,0 +1,166 @@ +# Akka Streams over network boundaries + +Stream references, or "stream refs" for short, allow running Akka Streams across multiple nodes within +an Akka Cluster. + +Unlike heavier "streaming data processing" frameworks, Akka Streams are not "deployed" nor automatically distributed. +Akka stream refs are, as the name implies, references to existing parts of a stream, and can be used to create a +distributed processing framework or introduce such capabilities in specific parts of your application, however they +are not on that level of abstraction by themselves. + +Stream refs are trivial to make use of in existing clustered Akka applications, and require no additional configuration +or setup. They automatically maintain flow-control / back-pressure over the network, and employ Akka's failure detection +mechanisms to fail-fast ("let it crash!") in the case of failures of remote nodes. They can be seen as an implementation +of the [Work Pulling Pattern](http://www.michaelpollmeier.com/akka-work-pulling-pattern), which one would otherwise +implement manually. + + +@@@ note + A useful way to think about stream refs is: + "like an `ActorRef`, but for Akka Streams's `Source` and `Sink`". + + Since they refer to an already existing, possibly remote, `Sink` or `Source`. + This is not to be mistaken with deploying streams remotely, which this feature is not intended for. +@@@ + + +@@@ note + Since Akka Streams are an implementation of Reactive Streams, by induction, + one can also say that stream refs allow running *Reactive Streams over the network*. +@@@ + +## Stream References + +The prime use case for stream refs is to replace raw actor or HTTP messaging between systems where a long +running stream of data is expected between two entities. Often times, they can be used to effectively achieve point +to point streaming without the need of setting up additional message brokers or similar secondary clusters. + +Stream refs are well suited for any system in which you need to send messages between nodes and need to do so in a +flow-controlled fashion. Typical examples include sending work requests to worker nodes, as fast as possible, but +not faster than the worker node can process them, or sending data elements which the downstream may be slow at processing. +It is recommended to mix and introduce stream refs in Actor messaging based systems, where the actor messaging is used to +orchestrate and prepare such message flows, and later the stream refs are used to do the flow-controlled message transfer. + +Stream refs are not persistent, however it is simple to build a resume-able stream by introducing such protocol +on the actor messaging layer. Stream refs are absolutely expected to be sent over Akka remoting to other nodes +within a cluster, and as such, complement and do not compete with plain Actor messaging. +Actors would usually be used to establish the stream, by means of some initial message saying +"I want to offer you many log elements (the stream ref)", or alternatively in the opposite way "If you need +to send me much data, here is the stream ref you can use to do so". + +Since the two sides ("local" and "remote") of reach reference may be confusing to simply refer to as +"remote" and "local" -- since either side can be seen as "local" or "remote" depending how we look at it -- +we propose to use the terminology "origin" and "target", which is defined by where the stream ref was created. +For `SourceRef`s, the "origin" is the side which has the data that it is going to stream out. For `SinkRef`s +the "origin" side is the actor system that is ready to receive the data and has allocated the ref. Those +two may be seen as duals of each other, however to explain patterns about sharing references, we found this + wording to be rather useful. + +### Source Refs - offering streaming data over network + +A @scala[@scaladoc[`SourceRef`](akka.stream.SourceRef)]@java[@javadoc[`SourceRef`](akka.stream.SourceRef)] +can be offered to a remote actor system in order for it to consume some source of data that we have prepared +locally. + +In order to share a `Source` with a remote endpoint you need to materialize it by running it into the `Sink.sourceRef`. +That sink materializes the `SourceRef` that you can then send to other nodes. Please note that it materializes into a +`Future` so you will have to use the pipeTo + +Scala +: @@snip [FlowStreamRefsDocSpec.scala]($code$/scala/docs/stream/FlowStreamRefsDocSpec.scala) { #offer-source } + +The origin actor which creates and owns the Source could also perform some validation or additional setup +when preparing the source. Once it has handed out the `SourceRef` the remote side can run it like this: + +Scala +: @@snip [FlowStreamRefsDocSpec.scala]($code$/scala/docs/stream/FlowStreamRefsDocSpec.scala) { #offer-source-use } + +The process of preparing and running a `SourceRef` powered distributed stream is shown by the animation below: + +![SourceRef usage animation](../images/source-ref-animation.gif) + +@@@ warning + A `SourceRef` is *by design* "single-shot". i.e. it may only be materialized once. + This is in order to not complicate the mental model what materializing such value would mean. + + By being single-shot, we always know what it means, and on top of those semantics offer a fan-out + by emitting multiple `SourceRef`s which target the same `Source` that uses `Broadcast`. + This also allows for fine grained control how many streams a system can expect to be running + at the same time, which is useful for capacity planning and "allowed number of concurrent streams + limiting" of clients. +@@@ + +### Sink Refs - offering to receive streaming data + +The dual of source references are A @scala[@scaladoc[`SourceRef`](akka.stream.SinkRef)]@java[@javadoc[`SourceRef`](akka.stream.SinkRef)]s. They can be used to offer the other side the capability to +send to the *origin* side data in a streaming, flow-controlled fashion. The origin here allocates a Sink, +which could be as simple as a `Sink.foreach` or as advanced as a complex sink which streams the incoming data +into various other systems (e.g. any of the Alpakka provided Sinks). + +@@@ note + To form a good mental model of `SinkRef`s, you can think of them as being similar to "passive mode" in FTP. +@@@ + +Scala +: @@snip [FlowStreamRefsDocSpec.scala]($code$/scala/docs/stream/FlowStreamRefsDocSpec.scala) { #offer-sink } + +Using the offered `SinkRef` to send data to the origin of the Sink is also simple, as we can treat the +SinkRef just as any other Sink and directly `runWith` or `run` with it. + +Scala +: @@snip [FlowStreamRefsDocSpec.scala]($code$/scala/docs/stream/FlowStreamRefsDocSpec.scala) { #offer-sink-use } + + + +![simple-graph-example.png](../images/sink-ref-dance.png) + +@@@ warning + A `SinkeRef` is *by design* "single-shot". i.e. it may only be materialized once. + This is in order to not complicate the mental model what materializing such value would mean. + + If you have an use case for building a fan-in operation accepting writes from multiple remote nodes, + you can build your Sink and prepend it with a `Merge` stage, each time materializing a new `SinkRef` + targeting that Merge. This has the added benefit of giving you full control how to merge these streams + (i.e. by using "merge preferred" or any other variation of the fan-in stages). +@@@ + +## Bulk Stream References + +@@@ warning + Not yet implemented. See ticket ...... FIXME, ticket number +@@@ + +Bulk stream references can be used to create simple to use side-channels to transfer humongous amounts +of data such as huge log files, messages or even media, with as much ease as if it was a trivial local stream. + +Connections for each stream ref bulk stream ref are established independently, and do not utilise +actor messaging (which is not designed for such bulk transfers, but rather small messages). + +## Configuration + +### Stream reference subscription timeouts + +All stream references have a subscription timeout, which is intended to prevent resource leaks +in situations in which a remote node would requests the allocation of many streams yet never actually run +them. In order to prevent this, each stream reference has a default timeout (of 30 seconds), after which +if it's "handed out" side has not been materialized, the origin will terminate with a timeout exception, +and IF the remote side eventually would be run afterwards, it would also immediately fail with an exception +pointing out that the origin seems to be missing. + +Since these timeouts are often very different based on the kind of stream offered, and there can be +many different kinds of them in the same application, it is possible to not only configure this setting +globally (`akka.stream.materializer.stream-ref.subscription-timeout`), but also via attributes: + + + +Scala +: @@snip [FlowStreamRefsDocSpec.scala]($code$/scala/docs/stream/FlowStreamRefsDocSpec.scala) { #attr-sub-timeout } + + + +## General configuration + +Other settings can be set globally, in your `application.conf`, by overriding any of the following values +in the `akka.stream.materializer.stream-ref.*` keyspace: + +@@snip [reference.conf]($akka$/akka-stream/src/main/resources/reference.conf) { #stream-ref } diff --git a/akka-docs/src/test/scala/docs/stream/FlowStreamRefsDocSpec.scala b/akka-docs/src/test/scala/docs/stream/FlowStreamRefsDocSpec.scala new file mode 100644 index 0000000000..bc674df352 --- /dev/null +++ b/akka-docs/src/test/scala/docs/stream/FlowStreamRefsDocSpec.scala @@ -0,0 +1,125 @@ +/** + * Copyright (C) 2018 Lightbend Inc. + */ +package docs.stream + +import akka.NotUsed +import akka.actor.{ Actor, Props } +import akka.stream.ActorMaterializer +import akka.stream.scaladsl._ +import akka.testkit.AkkaSpec +import docs.CompileOnlySpec + +class FlowStreamRefsDocSpec extends AkkaSpec with CompileOnlySpec { + + "offer a source ref" in compileOnlySpec { + //#offer-source + import akka.stream.SourceRef + + case class RequestLogs(streamId: Int) + case class LogsOffer(streamId: Int, sourceRef: SourceRef[String]) + + class DataSource extends Actor { + + implicit val mat = ActorMaterializer()(context) + + def receive = { + case RequestLogs(streamId) ⇒ + // obtain the source you want to offer: + val source: Source[String, NotUsed] = streamLogs(streamId) + + // materialize the SourceRef: + val ref: SourceRef[String] = source.runWith(Sink.sourceRef()) + + // wrap the SourceRef in some domain message, such that the sender knows what source it is + val reply: LogsOffer = LogsOffer(streamId, ref) + + // reply to sender + sender() ! reply + } + + def streamLogs(streamId: Long): Source[String, NotUsed] = ??? + } + //#offer-source + + implicit val mat = ActorMaterializer() + //#offer-source-use + val sourceActor = system.actorOf(Props[DataSource], "dataSource") + + sourceActor ! RequestLogs(1337) + val offer = expectMsgType[LogsOffer] + + // implicitly converted to a Source: + offer.sourceRef.runWith(Sink.foreach(println)) + // alternatively explicitly obtain Source from SourceRef: + // offer.sourceRef.source.runWith(Sink.foreach(println)) + + //#offer-source-use + } + + "offer a sink ref" in compileOnlySpec { + //#offer-sink + import akka.pattern._ + import akka.stream.SinkRef + + case class PrepareUpload(sourceId: String) + case class MeasurementsSinkReady(sourceId: String, sinkRef: SinkRef[String]) + + class DataReceiver extends Actor { + + import context.dispatcher + implicit val mat = ActorMaterializer()(context) + + def receive = { + case PrepareUpload(nodeId) ⇒ + // obtain the source you want to offer: + val sink: Sink[String, NotUsed] = logsSinkFor(nodeId) + + // materialize the SinkRef (the remote is like a source of data for us): + val ref: SinkRef[String] = Source.sinkRef[String]().to(sink).run() + + // wrap the SinkRef in some domain message, such that the sender knows what source it is + val reply: MeasurementsSinkReady = MeasurementsSinkReady(nodeId, ref) + + // reply to sender + sender() ! reply + } + + def logsSinkFor(nodeId: String): Sink[String, NotUsed] = ??? + } + + //#offer-sink + + implicit val mat = ActorMaterializer() + def localMetrics(): Source[String, NotUsed] = Source.single("") + + //#offer-sink-use + val receiver = system.actorOf(Props[DataReceiver], "receiver") + + receiver ! PrepareUpload("system-42-tmp") + val ready = expectMsgType[MeasurementsSinkReady] + + // stream local metrics to Sink's origin: + localMetrics().runWith(ready.sinkRef) + //#offer-sink-use + } + + "show how to configure timeouts with attrs" in compileOnlySpec { + + implicit val mat: ActorMaterializer = null + //#attr-sub-timeout + // configure the timeout for source + import scala.concurrent.duration._ + import akka.stream.StreamRefAttributes + + // configuring SourceRef.sink (notice that we apply the attributes to the Sink!): + Source.repeat("hello") + .runWith(Sink.sourceRef().addAttributes(StreamRefAttributes.subscriptionTimeout(5.seconds))) + + // configuring SinkRef.source: + Source.sinkRef().addAttributes(StreamRefAttributes.subscriptionTimeout(5.seconds)) + .runWith(Sink.ignore) // not very interesting Sink, just an example + //#attr-sub-timeout + } + +} diff --git a/akka-remote/src/main/scala/akka/remote/artery/SendQueue.scala b/akka-remote/src/main/scala/akka/remote/artery/SendQueue.scala index cf2c1a3107..0ff81be065 100644 --- a/akka-remote/src/main/scala/akka/remote/artery/SendQueue.scala +++ b/akka-remote/src/main/scala/akka/remote/artery/SendQueue.scala @@ -87,7 +87,8 @@ private[remote] final class SendQueue[T] extends GraphStageWithMaterializedValue needWakeup = true // additional poll() to grab any elements that might missed the needWakeup // and have been enqueued just after it - if (firstAttempt) tryPush(firstAttempt = false) + if (firstAttempt) + tryPush(firstAttempt = false) case elem ⇒ needWakeup = false // there will be another onPull push(out, elem) diff --git a/akka-stream-tests/src/test/scala/akka/stream/remote/StreamRefsSpec.scala b/akka-stream-tests/src/test/scala/akka/stream/remote/StreamRefsSpec.scala deleted file mode 100644 index ea8ffd59cc..0000000000 --- a/akka-stream-tests/src/test/scala/akka/stream/remote/StreamRefsSpec.scala +++ /dev/null @@ -1,274 +0,0 @@ -/** - * Copyright (C) 2014-2017 Lightbend Inc. - */ -package akka.stream.remote - -import akka.NotUsed -import akka.actor.{ Actor, ActorIdentity, ActorLogging, ActorRef, ActorSystem, ActorSystemImpl, Identify, Props } -import akka.stream.ActorMaterializer -import akka.stream.remote.scaladsl.{ SinkRef, SourceRef } -import akka.stream.scaladsl.{ Sink, Source } -import akka.testkit.{ AkkaSpec, ImplicitSender, SocketUtil, TestKit, TestProbe } -import akka.util.ByteString -import com.typesafe.config._ - -import scala.concurrent.duration._ -import scala.concurrent.{ Await, Future } - -object StreamRefsSpec { - - object DatasourceActor { - def props(probe: ActorRef): Props = - Props(new DatasourceActor(probe)) - .withDispatcher("akka.test.stream-dispatcher") - } - - class DatasourceActor(probe: ActorRef) extends Actor with ActorLogging { - implicit val mat = ActorMaterializer() - - def receive = { - case "give" ⇒ - /* - * Here we're able to send a source to a remote recipient - * - * For them it's a Source; for us it is a Sink we run data "into" - */ - val source: Source[String, NotUsed] = Source(List("hello", "world")) - val ref: Future[SourceRef[String]] = source.runWith(SourceRef.sink()) - - println(s"source = ${source}") - println(s"ref = ${Await.result(ref, 10.seconds)}") - - sender() ! Await.result(ref, 10.seconds) - - // case "send-bulk" ⇒ - // /* - // * Here we're able to send a source to a remote recipient - // * The source is a "bulk transfer one, in which we're ready to send a lot of data" - // * - // * For them it's a Source; for us it is a Sink we run data "into" - // */ - // val source: Source[ByteString, NotUsed] = Source.single(ByteString("huge-file-")) - // val ref: SourceRef[ByteString] = source.runWith(SourceRef.bulkTransfer()) - // sender() ! BulkSourceMsg(ref) - - case "receive" ⇒ - /* - * We write out code, knowing that the other side will stream the data into it. - * - * For them it's a Sink; for us it's a Source. - */ - val sink: Future[SinkRef[String]] = - SinkRef.source[String] - .to(Sink.actorRef(probe, "")) - .run() - - // FIXME we want to avoid forcing people to do the Future here - sender() ! Await.result(sink, 10.seconds) - - // case "receive-bulk" ⇒ - // /* - // * We write out code, knowing that the other side will stream the data into it. - // * This will open a dedicated connection per transfer. - // * - // * For them it's a Sink; for us it's a Source. - // */ - // val sink: SinkRef[ByteString] = - // SinkRef.bulkTransferSource() - // .to(Sink.actorRef(probe, "")) - // .run() - // - // - // sender() ! BulkSinkMsg(sink) - } - - } - - // ------------------------- - - final case class SourceMsg(dataSource: SourceRef[String]) - final case class BulkSourceMsg(dataSource: SourceRef[ByteString]) - final case class SinkMsg(dataSink: SinkRef[String]) - final case class BulkSinkMsg(dataSink: SinkRef[ByteString]) - - def config(): Config = { - val address = SocketUtil.temporaryServerAddress() - ConfigFactory.parseString( - s""" - akka { - loglevel = INFO - - actor { - provider = remote - serialize-messages = off - -// serializers { -// akka-stream-ref-test = "akka.stream.remote.StreamRefsSpecSerializer" -// } -// -// serialization-bindings { -// "akka.stream.remote.StreamRefsSpec$$SourceMsg" = akka-stream-ref-test -// "akka.stream.remote.StreamRefsSpec$$BulkSourceMsg" = akka-stream-ref-test -// "akka.stream.remote.StreamRefsSpec$$SinkMsg" = akka-stream-ref-test -// "akka.stream.remote.StreamRefsSpec$$BulkSinkMsg" = akka-stream-ref-test -// } -// -// serialization-identifiers { -// "akka.stream.remote.StreamRefsSpecSerializer" = 33 -// } - - } - - remote.netty.tcp { - port = ${address.getPort} - hostname = "${address.getHostName}" - } - } - """).withFallback(ConfigFactory.load()) - } -} - -class StreamRefsSpec(config: Config) extends AkkaSpec(config) with ImplicitSender { - import StreamRefsSpec._ - - def this() { - this(StreamRefsSpec.config()) - } - - val remoteSystem = ActorSystem("RemoteSystem", StreamRefsSpec.config()) - implicit val mat = ActorMaterializer() - - override protected def beforeTermination(): Unit = - TestKit.shutdownActorSystem(remoteSystem) - - val p = TestProbe() - - // obtain the remoteActor ref via selection in order to use _real_ remoting in this test - val remoteActor = { - val it = remoteSystem.actorOf(DatasourceActor.props(p.ref), "remoteActor") - val remoteAddress = remoteSystem.asInstanceOf[ActorSystemImpl].provider.getDefaultAddress - system.actorSelection(it.path.toStringWithAddress(remoteAddress)) ! Identify("hi") - expectMsgType[ActorIdentity].ref.get - } - - "A SourceRef" must { - - "send messages via remoting" in { - remoteActor ! "give" - val sourceRef = expectMsgType[SourceRef[String]] - - Source.fromGraph(sourceRef) - .log("RECEIVED") - .runWith(Sink.actorRef(p.ref, "")) - - p.expectMsg("hello") - p.expectMsg("world") - p.expectMsg("") - } - - } - - "A SinkRef" must { - - "receive elements via remoting" in { - - remoteActor ! "receive" - val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] - - Source("hello" :: "world" :: Nil) - .to(remoteSink) - .run() - - p.expectMsg("hello") - p.expectMsg("world") - p.expectMsg("") - } - - "fail origin if remote Sink gets a failure" in { - - remoteActor ! "receive" - val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] - - val remoteFailureMessage = "Booom!" - Source.failed(new Exception(remoteFailureMessage)) - .to(remoteSink) - .run() - - val f = p.expectMsgType[akka.actor.Status.Failure] - f.cause.getMessage should ===(s"Remote Sink failed, reason: $remoteFailureMessage") - } - - "receive hundreds of elements via remoting" in { - remoteActor ! "receive" - val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] - - val msgs = (1 to 100).toList.map(i ⇒ s"payload-$i") - - Source(msgs) - .to(remoteSink) - .run() - - msgs.foreach(t ⇒ p.expectMsg(t)) - p.expectMsg("") - } - - // "fail origin if remote Sink is stopped abruptly" in { - // val otherSystem = ActorSystem("OtherRemoteSystem", StreamRefsSpec.config()) - // - // try { - // // obtain the remoteActor ref via selection in order to use _real_ remoting in this test - // val remoteActor = { - // val it = otherSystem.actorOf(DatasourceActor.props(p.ref), "remoteActor") - // val remoteAddress = otherSystem.asInstanceOf[ActorSystemImpl].provider.getDefaultAddress - // system.actorSelection(it.path.toStringWithAddress(remoteAddress)) ! Identify("hi") - // expectMsgType[ActorIdentity].ref.get - // } - // - // remoteActor ! "receive" - // val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] - // - // val otherMat = ActorMaterializer()(otherSystem) - // Source.maybe[String] // not emitting anything - // .to(remoteSink) - // .run()(otherMat) - // - // // and the system crashes; which should cause abrupt termination in the stream - // Thread.sleep(300) - // otherMat.shutdown() - // - // val f = p.expectMsgType[akka.actor.Status.Failure] - // f.cause.getMessage should ===(s"Remote Sink failed, reason:") - // } finally TestKit.shutdownActorSystem(otherSystem) - // } - - } - -} -// -//class StreamRefsSpecSerializer(val system: ExtendedActorSystem) extends SerializerWithStringManifest with BaseSerializer { -// -// lazy val ext = SerializationExtension(system) -// -// override def manifest(o: AnyRef): String = o match { -// case StreamRefsSpec.SinkMsg(_) ⇒ "si" -// case StreamRefsSpec.BulkSinkMsg(_) ⇒ "bsi" -// case StreamRefsSpec.SourceMsg(_) ⇒ "so" -// case StreamRefsSpec.BulkSourceMsg(_) ⇒ "bso" -// } -// -// override def toBinary(o: AnyRef): Array[Byte] = { -// system.log.warning("Serializing: " + o) -// o match { -// case StreamRefsSpec.SinkMsg(s) ⇒ s. -// case StreamRefsSpec.BulkSinkMsg(s) ⇒ ext.serialize(s).get -// case StreamRefsSpec.SourceMsg(s) ⇒ ext.serialize(s).get -// case StreamRefsSpec.BulkSourceMsg(s) ⇒ ext.serialize(s).get -// } -// } -// -// override def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = { -// system.log.warning("MANI: " + manifest) -// ??? -// } -// -//} diff --git a/akka-stream-tests/src/test/scala/akka/stream/scaladsl/StreamRefsSpec.scala b/akka-stream-tests/src/test/scala/akka/stream/scaladsl/StreamRefsSpec.scala new file mode 100644 index 0000000000..217b16e741 --- /dev/null +++ b/akka-stream-tests/src/test/scala/akka/stream/scaladsl/StreamRefsSpec.scala @@ -0,0 +1,366 @@ +/** + * Copyright (C) 2014-2017 Lightbend Inc. + */ +package akka.stream.scaladsl + +import akka.NotUsed +import akka.actor.Status.Failure +import akka.actor.{ Actor, ActorIdentity, ActorLogging, ActorRef, ActorSystem, ActorSystemImpl, Identify, Props } +import akka.pattern._ +import akka.stream.testkit.TestPublisher +import akka.stream.testkit.scaladsl._ +import akka.stream.{ ActorMaterializer, SinkRef, SourceRef, StreamRefAttributes } +import akka.testkit.{ AkkaSpec, ImplicitSender, SocketUtil, TestKit, TestProbe } +import akka.util.ByteString +import com.typesafe.config._ + +import scala.concurrent.duration._ +import scala.concurrent.Future +import scala.util.control.NoStackTrace + +object StreamRefsSpec { + + object DataSourceActor { + def props(probe: ActorRef): Props = + Props(new DataSourceActor(probe)) + .withDispatcher("akka.test.stream-dispatcher") + } + + class DataSourceActor(probe: ActorRef) extends Actor with ActorLogging { + implicit val mat = ActorMaterializer() + + def receive = { + case "give" ⇒ + /* + * Here we're able to send a source to a remote recipient + * + * For them it's a Source; for us it is a Sink we run data "into" + */ + val source: Source[String, NotUsed] = Source(List("hello", "world")) + val ref: SourceRef[String] = source.runWith(Sink.sourceRef()) + + sender() ! ref + + case "give-infinite" ⇒ + val source: Source[String, NotUsed] = Source.fromIterator(() ⇒ Iterator.from(1)).map("ping-" + _) + val ref: SourceRef[String] = source.runWith(Sink.sourceRef()) + + sender() ! ref + + case "give-fail" ⇒ + val ref = Source.failed[String](new Exception("Booooom!") with NoStackTrace) + .runWith(Sink.sourceRef()) + + sender() ! ref + + case "give-complete-asap" ⇒ + val ref = Source.empty + .runWith(Sink.sourceRef()) + + sender() ! ref + + case "give-subscribe-timeout" ⇒ + val ref = Source.repeat("is anyone there?") + .toMat(Sink.sourceRef())(Keep.right) // attributes like this so they apply to the Sink.sourceRef + .withAttributes(StreamRefAttributes.subscriptionTimeout(500.millis)) + .run() + + sender() ! ref + + // case "send-bulk" ⇒ + // /* + // * Here we're able to send a source to a remote recipient + // * The source is a "bulk transfer one, in which we're ready to send a lot of data" + // * + // * For them it's a Source; for us it is a Sink we run data "into" + // */ + // val source: Source[ByteString, NotUsed] = Source.single(ByteString("huge-file-")) + // val ref: SourceRef[ByteString] = source.runWith(SourceRef.bulkTransfer()) + // sender() ! BulkSourceMsg(ref) + + case "receive" ⇒ + /* + * We write out code, knowing that the other side will stream the data into it. + * + * For them it's a Sink; for us it's a Source. + */ + val sink: SinkRef[String] = + Source.sinkRef[String] + .to(Sink.actorRef(probe, "")) + .run() + + sender() ! sink + + case "receive-subscribe-timeout" ⇒ + val sink = Source.sinkRef[String] + .withAttributes(StreamRefAttributes.subscriptionTimeout(500.millis)) + .to(Sink.actorRef(probe, "")) + .run() + + sender() ! sink + + case "receive-32" ⇒ + val (sink, driver) = Source.sinkRef[String] + .toMat(TestSink.probe(context.system))(Keep.both) + .run() + + import context.dispatcher + Future { + driver.ensureSubscription() + driver.request(2) + driver.expectNext() + driver.expectNext() + driver.expectNoMessage(100.millis) + driver.request(30) + driver.expectNextN(30) + + "" + } pipeTo probe + + sender() ! sink + + // case "receive-bulk" ⇒ + // /* + // * We write out code, knowing that the other side will stream the data into it. + // * This will open a dedicated connection per transfer. + // * + // * For them it's a Sink; for us it's a Source. + // */ + // val sink: SinkRef[ByteString] = + // SinkRef.bulkTransferSource() + // .to(Sink.actorRef(probe, "")) + // .run() + // + // + // sender() ! BulkSinkMsg(sink) + } + + } + + // ------------------------- + + final case class SourceMsg(dataSource: SourceRef[String]) + final case class BulkSourceMsg(dataSource: SourceRef[ByteString]) + final case class SinkMsg(dataSink: SinkRef[String]) + final case class BulkSinkMsg(dataSink: SinkRef[ByteString]) + + def config(): Config = { + val address = SocketUtil.temporaryServerAddress() + ConfigFactory.parseString( + s""" + akka { + loglevel = INFO + + actor { + provider = remote + serialize-messages = off + } + + remote.netty.tcp { + port = ${address.getPort} + hostname = "${address.getHostName}" + } + } + """).withFallback(ConfigFactory.load()) + } +} + +class StreamRefsSpec(config: Config) extends AkkaSpec(config) with ImplicitSender { + import StreamRefsSpec._ + + def this() { + this(StreamRefsSpec.config()) + } + + val remoteSystem = ActorSystem("RemoteSystem", StreamRefsSpec.config()) + implicit val mat = ActorMaterializer() + + override protected def beforeTermination(): Unit = + TestKit.shutdownActorSystem(remoteSystem) + + val p = TestProbe() + + // obtain the remoteActor ref via selection in order to use _real_ remoting in this test + val remoteActor = { + val it = remoteSystem.actorOf(DataSourceActor.props(p.ref), "remoteActor") + val remoteAddress = remoteSystem.asInstanceOf[ActorSystemImpl].provider.getDefaultAddress + system.actorSelection(it.path.toStringWithAddress(remoteAddress)) ! Identify("hi") + expectMsgType[ActorIdentity].ref.get + } + + "A SourceRef" must { + + "send messages via remoting" in { + remoteActor ! "give" + val sourceRef = expectMsgType[SourceRef[String]] + + sourceRef + .runWith(Sink.actorRef(p.ref, "")) + + p.expectMsg("hello") + p.expectMsg("world") + p.expectMsg("") + } + + "fail when remote source failed" in { + remoteActor ! "give-fail" + val sourceRef = expectMsgType[SourceRef[String]] + + sourceRef + .runWith(Sink.actorRef(p.ref, "")) + + val f = p.expectMsgType[Failure] + f.cause.getMessage should include("Remote stream (") + // actor name here, for easier identification + f.cause.getMessage should include("failed, reason: Booooom!") + } + + "complete properly when remote source is empty" in { + // this is a special case since it makes sure that the remote stage is still there when we connect to it + + remoteActor ! "give-complete-asap" + val sourceRef = expectMsgType[SourceRef[String]] + + sourceRef + .runWith(Sink.actorRef(p.ref, "")) + + p.expectMsg("") + } + + "respect back-pressure from (implied by target Sink)" in { + remoteActor ! "give-infinite" + val sourceRef = expectMsgType[SourceRef[String]] + + val probe = sourceRef + .runWith(TestSink.probe) + + probe.ensureSubscription() + probe.expectNoMessage(100.millis) + + probe.request(1) + probe.expectNext("ping-1") + probe.expectNoMessage(100.millis) + + probe.request(20) + probe.expectNextN((1 to 20).map(i ⇒ "ping-" + (i + 1))) + probe.cancel() + + // since no demand anyway + probe.expectNoMessage(100.millis) + + // should not cause more pulling, since we issued a cancel already + probe.request(10) + probe.expectNoMessage(100.millis) + } + + "receive timeout if subscribing too late to the source ref" in { + remoteActor ! "give-subscribe-timeout" + val remoteSource: SourceRef[String] = expectMsgType[SourceRef[String]] + + // not materializing it, awaiting the timeout... + Thread.sleep(800) // the timeout is 500ms + + val probe = remoteSource + .runWith(TestSink.probe[String](system)) + + // val failure = p.expectMsgType[Failure] + // failure.cause.getMessage should include("[SourceRef-0] Remote side did not subscribe (materialize) handed out Sink reference") + + // the local "remote sink" should cancel, since it should notice the origin target actor is dead + probe.ensureSubscription() + val ex = probe.expectError() + ex.getMessage should include("has terminated! Tearing down this side of the stream as well.") + } + } + + "A SinkRef" must { + + "receive elements via remoting" in { + + remoteActor ! "receive" + val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] + + Source("hello" :: "world" :: Nil) + .to(remoteSink) + .run() + + p.expectMsg("hello") + p.expectMsg("world") + p.expectMsg("") + } + + "fail origin if remote Sink gets a failure" in { + + remoteActor ! "receive" + val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] + + val remoteFailureMessage = "Booom!" + Source.failed(new Exception(remoteFailureMessage)) + .to(remoteSink) + .run() + + val f = p.expectMsgType[akka.actor.Status.Failure] + f.cause.getMessage should include(s"Remote stream (") + // actor name ere, for easier identification + f.cause.getMessage should include(s"failed, reason: $remoteFailureMessage") + } + + "receive hundreds of elements via remoting" in { + remoteActor ! "receive" + val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] + + val msgs = (1 to 100).toList.map(i ⇒ s"payload-$i") + + Source(msgs) + .runWith(remoteSink) + + msgs.foreach(t ⇒ p.expectMsg(t)) + p.expectMsg("") + } + + "receive timeout if subscribing too late to the sink ref" in { + remoteActor ! "receive-subscribe-timeout" + val remoteSink: SinkRef[String] = expectMsgType[SinkRef[String]] + + // not materializing it, awaiting the timeout... + Thread.sleep(800) // the timeout is 500ms + + val probe = TestSource.probe[String](system) + .to(remoteSink) + .run() + + val failure = p.expectMsgType[Failure] + failure.cause.getMessage should include("Remote side did not subscribe (materialize) handed out Sink reference") + + // the local "remote sink" should cancel, since it should notice the origin target actor is dead + probe.expectCancellation() + } + + "respect back -pressure from (implied by origin Sink)" in { + remoteActor ! "receive-32" + val sinkRef = expectMsgType[SinkRef[String]] + + Source.repeat("hello") runWith sinkRef + + // if we get this message, it means no checks in the request/expect semantics were broken, good! + p.expectMsg("") + } + + "not allow materializing multiple times" in { + remoteActor ! "receive" + val sinkRef = expectMsgType[SinkRef[String]] + + val p1: TestPublisher.Probe[String] = TestSource.probe[String].to(sinkRef).run() + val p2: TestPublisher.Probe[String] = TestSource.probe[String].to(sinkRef).run() + + p1.ensureSubscription() + val req = p1.expectRequest() + + // will be cancelled immediately, since it's 2nd: + p2.ensureSubscription() + p2.expectCancellation() + } + + } + +} diff --git a/akka-stream/src/main/java/akka/stream/remote/StreamRefContainers.java b/akka-stream/src/main/java/akka/stream/StreamRefMessages.java similarity index 70% rename from akka-stream/src/main/java/akka/stream/remote/StreamRefContainers.java rename to akka-stream/src/main/java/akka/stream/StreamRefMessages.java index 8175eefff9..513ec254bd 100644 --- a/akka-stream/src/main/java/akka/stream/remote/StreamRefContainers.java +++ b/akka-stream/src/main/java/akka/stream/StreamRefMessages.java @@ -1,10 +1,10 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! -// source: StreamRefContainers.proto +// source: StreamRefMessages.proto -package akka.stream.remote; +package akka.stream; -public final class StreamRefContainers { - private StreamRefContainers() {} +public final class StreamRefMessages { + private StreamRefMessages() {} public static void registerAllExtensions( akka.protobuf.ExtensionRegistry registry) { } @@ -19,21 +19,11 @@ public final class StreamRefContainers { /** * required .ActorRef targetRef = 1; */ - akka.stream.remote.StreamRefContainers.ActorRef getTargetRef(); + akka.stream.StreamRefMessages.ActorRef getTargetRef(); /** * required .ActorRef targetRef = 1; */ - akka.stream.remote.StreamRefContainers.ActorRefOrBuilder getTargetRefOrBuilder(); - - // optional int64 initialDemand = 2; - /** - * optional int64 initialDemand = 2; - */ - boolean hasInitialDemand(); - /** - * optional int64 initialDemand = 2; - */ - long getInitialDemand(); + akka.stream.StreamRefMessages.ActorRefOrBuilder getTargetRefOrBuilder(); } /** * Protobuf type {@code SinkRef} @@ -87,11 +77,11 @@ public final class StreamRefContainers { break; } case 10: { - akka.stream.remote.StreamRefContainers.ActorRef.Builder subBuilder = null; + akka.stream.StreamRefMessages.ActorRef.Builder subBuilder = null; if (((bitField0_ & 0x00000001) == 0x00000001)) { subBuilder = targetRef_.toBuilder(); } - targetRef_ = input.readMessage(akka.stream.remote.StreamRefContainers.ActorRef.PARSER, extensionRegistry); + targetRef_ = input.readMessage(akka.stream.StreamRefMessages.ActorRef.PARSER, extensionRegistry); if (subBuilder != null) { subBuilder.mergeFrom(targetRef_); targetRef_ = subBuilder.buildPartial(); @@ -99,11 +89,6 @@ public final class StreamRefContainers { bitField0_ |= 0x00000001; break; } - case 16: { - bitField0_ |= 0x00000002; - initialDemand_ = input.readInt64(); - break; - } } } } catch (akka.protobuf.InvalidProtocolBufferException e) { @@ -118,14 +103,14 @@ public final class StreamRefContainers { } public static final akka.protobuf.Descriptors.Descriptor getDescriptor() { - return akka.stream.remote.StreamRefContainers.internal_static_SinkRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_SinkRef_descriptor; } protected akka.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return akka.stream.remote.StreamRefContainers.internal_static_SinkRef_fieldAccessorTable + return akka.stream.StreamRefMessages.internal_static_SinkRef_fieldAccessorTable .ensureFieldAccessorsInitialized( - akka.stream.remote.StreamRefContainers.SinkRef.class, akka.stream.remote.StreamRefContainers.SinkRef.Builder.class); + akka.stream.StreamRefMessages.SinkRef.class, akka.stream.StreamRefMessages.SinkRef.Builder.class); } public static akka.protobuf.Parser PARSER = @@ -146,7 +131,7 @@ public final class StreamRefContainers { private int bitField0_; // required .ActorRef targetRef = 1; public static final int TARGETREF_FIELD_NUMBER = 1; - private akka.stream.remote.StreamRefContainers.ActorRef targetRef_; + private akka.stream.StreamRefMessages.ActorRef targetRef_; /** * required .ActorRef targetRef = 1; */ @@ -156,35 +141,18 @@ public final class StreamRefContainers { /** * required .ActorRef targetRef = 1; */ - public akka.stream.remote.StreamRefContainers.ActorRef getTargetRef() { + public akka.stream.StreamRefMessages.ActorRef getTargetRef() { return targetRef_; } /** * required .ActorRef targetRef = 1; */ - public akka.stream.remote.StreamRefContainers.ActorRefOrBuilder getTargetRefOrBuilder() { + public akka.stream.StreamRefMessages.ActorRefOrBuilder getTargetRefOrBuilder() { return targetRef_; } - // optional int64 initialDemand = 2; - public static final int INITIALDEMAND_FIELD_NUMBER = 2; - private long initialDemand_; - /** - * optional int64 initialDemand = 2; - */ - public boolean hasInitialDemand() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional int64 initialDemand = 2; - */ - public long getInitialDemand() { - return initialDemand_; - } - private void initFields() { - targetRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); - initialDemand_ = 0L; + targetRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -209,9 +177,6 @@ public final class StreamRefContainers { if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeMessage(1, targetRef_); } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - output.writeInt64(2, initialDemand_); - } getUnknownFields().writeTo(output); } @@ -225,10 +190,6 @@ public final class StreamRefContainers { size += akka.protobuf.CodedOutputStream .computeMessageSize(1, targetRef_); } - if (((bitField0_ & 0x00000002) == 0x00000002)) { - size += akka.protobuf.CodedOutputStream - .computeInt64Size(2, initialDemand_); - } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -241,53 +202,53 @@ public final class StreamRefContainers { return super.writeReplace(); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom( + public static akka.stream.StreamRefMessages.SinkRef parseFrom( akka.protobuf.ByteString data) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom( + public static akka.stream.StreamRefMessages.SinkRef parseFrom( akka.protobuf.ByteString data, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom(byte[] data) + public static akka.stream.StreamRefMessages.SinkRef parseFrom(byte[] data) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom( + public static akka.stream.StreamRefMessages.SinkRef parseFrom( byte[] data, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom(java.io.InputStream input) + public static akka.stream.StreamRefMessages.SinkRef parseFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom( + public static akka.stream.StreamRefMessages.SinkRef parseFrom( java.io.InputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseFrom(input, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseDelimitedFrom(java.io.InputStream input) + public static akka.stream.StreamRefMessages.SinkRef parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseDelimitedFrom(input); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseDelimitedFrom( + public static akka.stream.StreamRefMessages.SinkRef parseDelimitedFrom( java.io.InputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseDelimitedFrom(input, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom( + public static akka.stream.StreamRefMessages.SinkRef parseFrom( akka.protobuf.CodedInputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static akka.stream.remote.StreamRefContainers.SinkRef parseFrom( + public static akka.stream.StreamRefMessages.SinkRef parseFrom( akka.protobuf.CodedInputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -296,7 +257,7 @@ public final class StreamRefContainers { public static Builder newBuilder() { return Builder.create(); } public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(akka.stream.remote.StreamRefContainers.SinkRef prototype) { + public static Builder newBuilder(akka.stream.StreamRefMessages.SinkRef prototype) { return newBuilder().mergeFrom(prototype); } public Builder toBuilder() { return newBuilder(this); } @@ -312,20 +273,20 @@ public final class StreamRefContainers { */ public static final class Builder extends akka.protobuf.GeneratedMessage.Builder - implements akka.stream.remote.StreamRefContainers.SinkRefOrBuilder { + implements akka.stream.StreamRefMessages.SinkRefOrBuilder { public static final akka.protobuf.Descriptors.Descriptor getDescriptor() { - return akka.stream.remote.StreamRefContainers.internal_static_SinkRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_SinkRef_descriptor; } protected akka.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return akka.stream.remote.StreamRefContainers.internal_static_SinkRef_fieldAccessorTable + return akka.stream.StreamRefMessages.internal_static_SinkRef_fieldAccessorTable .ensureFieldAccessorsInitialized( - akka.stream.remote.StreamRefContainers.SinkRef.class, akka.stream.remote.StreamRefContainers.SinkRef.Builder.class); + akka.stream.StreamRefMessages.SinkRef.class, akka.stream.StreamRefMessages.SinkRef.Builder.class); } - // Construct using akka.stream.remote.StreamRefContainers.SinkRef.newBuilder() + // Construct using akka.stream.StreamRefMessages.SinkRef.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -347,13 +308,11 @@ public final class StreamRefContainers { public Builder clear() { super.clear(); if (targetRefBuilder_ == null) { - targetRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + targetRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); } else { targetRefBuilder_.clear(); } bitField0_ = (bitField0_ & ~0x00000001); - initialDemand_ = 0L; - bitField0_ = (bitField0_ & ~0x00000002); return this; } @@ -363,23 +322,23 @@ public final class StreamRefContainers { public akka.protobuf.Descriptors.Descriptor getDescriptorForType() { - return akka.stream.remote.StreamRefContainers.internal_static_SinkRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_SinkRef_descriptor; } - public akka.stream.remote.StreamRefContainers.SinkRef getDefaultInstanceForType() { - return akka.stream.remote.StreamRefContainers.SinkRef.getDefaultInstance(); + public akka.stream.StreamRefMessages.SinkRef getDefaultInstanceForType() { + return akka.stream.StreamRefMessages.SinkRef.getDefaultInstance(); } - public akka.stream.remote.StreamRefContainers.SinkRef build() { - akka.stream.remote.StreamRefContainers.SinkRef result = buildPartial(); + public akka.stream.StreamRefMessages.SinkRef build() { + akka.stream.StreamRefMessages.SinkRef result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } return result; } - public akka.stream.remote.StreamRefContainers.SinkRef buildPartial() { - akka.stream.remote.StreamRefContainers.SinkRef result = new akka.stream.remote.StreamRefContainers.SinkRef(this); + public akka.stream.StreamRefMessages.SinkRef buildPartial() { + akka.stream.StreamRefMessages.SinkRef result = new akka.stream.StreamRefMessages.SinkRef(this); int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) == 0x00000001)) { @@ -390,32 +349,25 @@ public final class StreamRefContainers { } else { result.targetRef_ = targetRefBuilder_.build(); } - if (((from_bitField0_ & 0x00000002) == 0x00000002)) { - to_bitField0_ |= 0x00000002; - } - result.initialDemand_ = initialDemand_; result.bitField0_ = to_bitField0_; onBuilt(); return result; } public Builder mergeFrom(akka.protobuf.Message other) { - if (other instanceof akka.stream.remote.StreamRefContainers.SinkRef) { - return mergeFrom((akka.stream.remote.StreamRefContainers.SinkRef)other); + if (other instanceof akka.stream.StreamRefMessages.SinkRef) { + return mergeFrom((akka.stream.StreamRefMessages.SinkRef)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(akka.stream.remote.StreamRefContainers.SinkRef other) { - if (other == akka.stream.remote.StreamRefContainers.SinkRef.getDefaultInstance()) return this; + public Builder mergeFrom(akka.stream.StreamRefMessages.SinkRef other) { + if (other == akka.stream.StreamRefMessages.SinkRef.getDefaultInstance()) return this; if (other.hasTargetRef()) { mergeTargetRef(other.getTargetRef()); } - if (other.hasInitialDemand()) { - setInitialDemand(other.getInitialDemand()); - } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -436,11 +388,11 @@ public final class StreamRefContainers { akka.protobuf.CodedInputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - akka.stream.remote.StreamRefContainers.SinkRef parsedMessage = null; + akka.stream.StreamRefMessages.SinkRef parsedMessage = null; try { parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (akka.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (akka.stream.remote.StreamRefContainers.SinkRef) e.getUnfinishedMessage(); + parsedMessage = (akka.stream.StreamRefMessages.SinkRef) e.getUnfinishedMessage(); throw e; } finally { if (parsedMessage != null) { @@ -452,9 +404,9 @@ public final class StreamRefContainers { private int bitField0_; // required .ActorRef targetRef = 1; - private akka.stream.remote.StreamRefContainers.ActorRef targetRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + private akka.stream.StreamRefMessages.ActorRef targetRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); private akka.protobuf.SingleFieldBuilder< - akka.stream.remote.StreamRefContainers.ActorRef, akka.stream.remote.StreamRefContainers.ActorRef.Builder, akka.stream.remote.StreamRefContainers.ActorRefOrBuilder> targetRefBuilder_; + akka.stream.StreamRefMessages.ActorRef, akka.stream.StreamRefMessages.ActorRef.Builder, akka.stream.StreamRefMessages.ActorRefOrBuilder> targetRefBuilder_; /** * required .ActorRef targetRef = 1; */ @@ -464,7 +416,7 @@ public final class StreamRefContainers { /** * required .ActorRef targetRef = 1; */ - public akka.stream.remote.StreamRefContainers.ActorRef getTargetRef() { + public akka.stream.StreamRefMessages.ActorRef getTargetRef() { if (targetRefBuilder_ == null) { return targetRef_; } else { @@ -474,7 +426,7 @@ public final class StreamRefContainers { /** * required .ActorRef targetRef = 1; */ - public Builder setTargetRef(akka.stream.remote.StreamRefContainers.ActorRef value) { + public Builder setTargetRef(akka.stream.StreamRefMessages.ActorRef value) { if (targetRefBuilder_ == null) { if (value == null) { throw new NullPointerException(); @@ -491,7 +443,7 @@ public final class StreamRefContainers { * required .ActorRef targetRef = 1; */ public Builder setTargetRef( - akka.stream.remote.StreamRefContainers.ActorRef.Builder builderForValue) { + akka.stream.StreamRefMessages.ActorRef.Builder builderForValue) { if (targetRefBuilder_ == null) { targetRef_ = builderForValue.build(); onChanged(); @@ -504,12 +456,12 @@ public final class StreamRefContainers { /** * required .ActorRef targetRef = 1; */ - public Builder mergeTargetRef(akka.stream.remote.StreamRefContainers.ActorRef value) { + public Builder mergeTargetRef(akka.stream.StreamRefMessages.ActorRef value) { if (targetRefBuilder_ == null) { if (((bitField0_ & 0x00000001) == 0x00000001) && - targetRef_ != akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance()) { + targetRef_ != akka.stream.StreamRefMessages.ActorRef.getDefaultInstance()) { targetRef_ = - akka.stream.remote.StreamRefContainers.ActorRef.newBuilder(targetRef_).mergeFrom(value).buildPartial(); + akka.stream.StreamRefMessages.ActorRef.newBuilder(targetRef_).mergeFrom(value).buildPartial(); } else { targetRef_ = value; } @@ -525,7 +477,7 @@ public final class StreamRefContainers { */ public Builder clearTargetRef() { if (targetRefBuilder_ == null) { - targetRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + targetRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); onChanged(); } else { targetRefBuilder_.clear(); @@ -536,7 +488,7 @@ public final class StreamRefContainers { /** * required .ActorRef targetRef = 1; */ - public akka.stream.remote.StreamRefContainers.ActorRef.Builder getTargetRefBuilder() { + public akka.stream.StreamRefMessages.ActorRef.Builder getTargetRefBuilder() { bitField0_ |= 0x00000001; onChanged(); return getTargetRefFieldBuilder().getBuilder(); @@ -544,7 +496,7 @@ public final class StreamRefContainers { /** * required .ActorRef targetRef = 1; */ - public akka.stream.remote.StreamRefContainers.ActorRefOrBuilder getTargetRefOrBuilder() { + public akka.stream.StreamRefMessages.ActorRefOrBuilder getTargetRefOrBuilder() { if (targetRefBuilder_ != null) { return targetRefBuilder_.getMessageOrBuilder(); } else { @@ -555,11 +507,11 @@ public final class StreamRefContainers { * required .ActorRef targetRef = 1; */ private akka.protobuf.SingleFieldBuilder< - akka.stream.remote.StreamRefContainers.ActorRef, akka.stream.remote.StreamRefContainers.ActorRef.Builder, akka.stream.remote.StreamRefContainers.ActorRefOrBuilder> + akka.stream.StreamRefMessages.ActorRef, akka.stream.StreamRefMessages.ActorRef.Builder, akka.stream.StreamRefMessages.ActorRefOrBuilder> getTargetRefFieldBuilder() { if (targetRefBuilder_ == null) { targetRefBuilder_ = new akka.protobuf.SingleFieldBuilder< - akka.stream.remote.StreamRefContainers.ActorRef, akka.stream.remote.StreamRefContainers.ActorRef.Builder, akka.stream.remote.StreamRefContainers.ActorRefOrBuilder>( + akka.stream.StreamRefMessages.ActorRef, akka.stream.StreamRefMessages.ActorRef.Builder, akka.stream.StreamRefMessages.ActorRefOrBuilder>( targetRef_, getParentForChildren(), isClean()); @@ -568,39 +520,6 @@ public final class StreamRefContainers { return targetRefBuilder_; } - // optional int64 initialDemand = 2; - private long initialDemand_ ; - /** - * optional int64 initialDemand = 2; - */ - public boolean hasInitialDemand() { - return ((bitField0_ & 0x00000002) == 0x00000002); - } - /** - * optional int64 initialDemand = 2; - */ - public long getInitialDemand() { - return initialDemand_; - } - /** - * optional int64 initialDemand = 2; - */ - public Builder setInitialDemand(long value) { - bitField0_ |= 0x00000002; - initialDemand_ = value; - onChanged(); - return this; - } - /** - * optional int64 initialDemand = 2; - */ - public Builder clearInitialDemand() { - bitField0_ = (bitField0_ & ~0x00000002); - initialDemand_ = 0L; - onChanged(); - return this; - } - // @@protoc_insertion_point(builder_scope:SinkRef) } @@ -618,31 +537,16 @@ public final class StreamRefContainers { // required .ActorRef originRef = 1; /** * required .ActorRef originRef = 1; - * - *
-     * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-     * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-     * 
*/ boolean hasOriginRef(); /** * required .ActorRef originRef = 1; - * - *
-     * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-     * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-     * 
*/ - akka.stream.remote.StreamRefContainers.ActorRef getOriginRef(); + akka.stream.StreamRefMessages.ActorRef getOriginRef(); /** * required .ActorRef originRef = 1; - * - *
-     * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-     * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-     * 
*/ - akka.stream.remote.StreamRefContainers.ActorRefOrBuilder getOriginRefOrBuilder(); + akka.stream.StreamRefMessages.ActorRefOrBuilder getOriginRefOrBuilder(); } /** * Protobuf type {@code SourceRef} @@ -696,11 +600,11 @@ public final class StreamRefContainers { break; } case 10: { - akka.stream.remote.StreamRefContainers.ActorRef.Builder subBuilder = null; + akka.stream.StreamRefMessages.ActorRef.Builder subBuilder = null; if (((bitField0_ & 0x00000001) == 0x00000001)) { subBuilder = originRef_.toBuilder(); } - originRef_ = input.readMessage(akka.stream.remote.StreamRefContainers.ActorRef.PARSER, extensionRegistry); + originRef_ = input.readMessage(akka.stream.StreamRefMessages.ActorRef.PARSER, extensionRegistry); if (subBuilder != null) { subBuilder.mergeFrom(originRef_); originRef_ = subBuilder.buildPartial(); @@ -722,14 +626,14 @@ public final class StreamRefContainers { } public static final akka.protobuf.Descriptors.Descriptor getDescriptor() { - return akka.stream.remote.StreamRefContainers.internal_static_SourceRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_SourceRef_descriptor; } protected akka.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return akka.stream.remote.StreamRefContainers.internal_static_SourceRef_fieldAccessorTable + return akka.stream.StreamRefMessages.internal_static_SourceRef_fieldAccessorTable .ensureFieldAccessorsInitialized( - akka.stream.remote.StreamRefContainers.SourceRef.class, akka.stream.remote.StreamRefContainers.SourceRef.Builder.class); + akka.stream.StreamRefMessages.SourceRef.class, akka.stream.StreamRefMessages.SourceRef.Builder.class); } public static akka.protobuf.Parser PARSER = @@ -750,43 +654,28 @@ public final class StreamRefContainers { private int bitField0_; // required .ActorRef originRef = 1; public static final int ORIGINREF_FIELD_NUMBER = 1; - private akka.stream.remote.StreamRefContainers.ActorRef originRef_; + private akka.stream.StreamRefMessages.ActorRef originRef_; /** * required .ActorRef originRef = 1; - * - *
-     * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-     * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-     * 
*/ public boolean hasOriginRef() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** * required .ActorRef originRef = 1; - * - *
-     * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-     * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-     * 
*/ - public akka.stream.remote.StreamRefContainers.ActorRef getOriginRef() { + public akka.stream.StreamRefMessages.ActorRef getOriginRef() { return originRef_; } /** * required .ActorRef originRef = 1; - * - *
-     * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-     * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-     * 
*/ - public akka.stream.remote.StreamRefContainers.ActorRefOrBuilder getOriginRefOrBuilder() { + public akka.stream.StreamRefMessages.ActorRefOrBuilder getOriginRefOrBuilder() { return originRef_; } private void initFields() { - originRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + originRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -836,53 +725,53 @@ public final class StreamRefContainers { return super.writeReplace(); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom( + public static akka.stream.StreamRefMessages.SourceRef parseFrom( akka.protobuf.ByteString data) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom( + public static akka.stream.StreamRefMessages.SourceRef parseFrom( akka.protobuf.ByteString data, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom(byte[] data) + public static akka.stream.StreamRefMessages.SourceRef parseFrom(byte[] data) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom( + public static akka.stream.StreamRefMessages.SourceRef parseFrom( byte[] data, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom(java.io.InputStream input) + public static akka.stream.StreamRefMessages.SourceRef parseFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom( + public static akka.stream.StreamRefMessages.SourceRef parseFrom( java.io.InputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseFrom(input, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseDelimitedFrom(java.io.InputStream input) + public static akka.stream.StreamRefMessages.SourceRef parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseDelimitedFrom(input); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseDelimitedFrom( + public static akka.stream.StreamRefMessages.SourceRef parseDelimitedFrom( java.io.InputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseDelimitedFrom(input, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom( + public static akka.stream.StreamRefMessages.SourceRef parseFrom( akka.protobuf.CodedInputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static akka.stream.remote.StreamRefContainers.SourceRef parseFrom( + public static akka.stream.StreamRefMessages.SourceRef parseFrom( akka.protobuf.CodedInputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -891,7 +780,7 @@ public final class StreamRefContainers { public static Builder newBuilder() { return Builder.create(); } public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(akka.stream.remote.StreamRefContainers.SourceRef prototype) { + public static Builder newBuilder(akka.stream.StreamRefMessages.SourceRef prototype) { return newBuilder().mergeFrom(prototype); } public Builder toBuilder() { return newBuilder(this); } @@ -907,20 +796,20 @@ public final class StreamRefContainers { */ public static final class Builder extends akka.protobuf.GeneratedMessage.Builder - implements akka.stream.remote.StreamRefContainers.SourceRefOrBuilder { + implements akka.stream.StreamRefMessages.SourceRefOrBuilder { public static final akka.protobuf.Descriptors.Descriptor getDescriptor() { - return akka.stream.remote.StreamRefContainers.internal_static_SourceRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_SourceRef_descriptor; } protected akka.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return akka.stream.remote.StreamRefContainers.internal_static_SourceRef_fieldAccessorTable + return akka.stream.StreamRefMessages.internal_static_SourceRef_fieldAccessorTable .ensureFieldAccessorsInitialized( - akka.stream.remote.StreamRefContainers.SourceRef.class, akka.stream.remote.StreamRefContainers.SourceRef.Builder.class); + akka.stream.StreamRefMessages.SourceRef.class, akka.stream.StreamRefMessages.SourceRef.Builder.class); } - // Construct using akka.stream.remote.StreamRefContainers.SourceRef.newBuilder() + // Construct using akka.stream.StreamRefMessages.SourceRef.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -942,7 +831,7 @@ public final class StreamRefContainers { public Builder clear() { super.clear(); if (originRefBuilder_ == null) { - originRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + originRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); } else { originRefBuilder_.clear(); } @@ -956,23 +845,23 @@ public final class StreamRefContainers { public akka.protobuf.Descriptors.Descriptor getDescriptorForType() { - return akka.stream.remote.StreamRefContainers.internal_static_SourceRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_SourceRef_descriptor; } - public akka.stream.remote.StreamRefContainers.SourceRef getDefaultInstanceForType() { - return akka.stream.remote.StreamRefContainers.SourceRef.getDefaultInstance(); + public akka.stream.StreamRefMessages.SourceRef getDefaultInstanceForType() { + return akka.stream.StreamRefMessages.SourceRef.getDefaultInstance(); } - public akka.stream.remote.StreamRefContainers.SourceRef build() { - akka.stream.remote.StreamRefContainers.SourceRef result = buildPartial(); + public akka.stream.StreamRefMessages.SourceRef build() { + akka.stream.StreamRefMessages.SourceRef result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } return result; } - public akka.stream.remote.StreamRefContainers.SourceRef buildPartial() { - akka.stream.remote.StreamRefContainers.SourceRef result = new akka.stream.remote.StreamRefContainers.SourceRef(this); + public akka.stream.StreamRefMessages.SourceRef buildPartial() { + akka.stream.StreamRefMessages.SourceRef result = new akka.stream.StreamRefMessages.SourceRef(this); int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) == 0x00000001)) { @@ -989,16 +878,16 @@ public final class StreamRefContainers { } public Builder mergeFrom(akka.protobuf.Message other) { - if (other instanceof akka.stream.remote.StreamRefContainers.SourceRef) { - return mergeFrom((akka.stream.remote.StreamRefContainers.SourceRef)other); + if (other instanceof akka.stream.StreamRefMessages.SourceRef) { + return mergeFrom((akka.stream.StreamRefMessages.SourceRef)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(akka.stream.remote.StreamRefContainers.SourceRef other) { - if (other == akka.stream.remote.StreamRefContainers.SourceRef.getDefaultInstance()) return this; + public Builder mergeFrom(akka.stream.StreamRefMessages.SourceRef other) { + if (other == akka.stream.StreamRefMessages.SourceRef.getDefaultInstance()) return this; if (other.hasOriginRef()) { mergeOriginRef(other.getOriginRef()); } @@ -1022,11 +911,11 @@ public final class StreamRefContainers { akka.protobuf.CodedInputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - akka.stream.remote.StreamRefContainers.SourceRef parsedMessage = null; + akka.stream.StreamRefMessages.SourceRef parsedMessage = null; try { parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (akka.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (akka.stream.remote.StreamRefContainers.SourceRef) e.getUnfinishedMessage(); + parsedMessage = (akka.stream.StreamRefMessages.SourceRef) e.getUnfinishedMessage(); throw e; } finally { if (parsedMessage != null) { @@ -1038,29 +927,19 @@ public final class StreamRefContainers { private int bitField0_; // required .ActorRef originRef = 1; - private akka.stream.remote.StreamRefContainers.ActorRef originRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + private akka.stream.StreamRefMessages.ActorRef originRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); private akka.protobuf.SingleFieldBuilder< - akka.stream.remote.StreamRefContainers.ActorRef, akka.stream.remote.StreamRefContainers.ActorRef.Builder, akka.stream.remote.StreamRefContainers.ActorRefOrBuilder> originRefBuilder_; + akka.stream.StreamRefMessages.ActorRef, akka.stream.StreamRefMessages.ActorRef.Builder, akka.stream.StreamRefMessages.ActorRefOrBuilder> originRefBuilder_; /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ public boolean hasOriginRef() { return ((bitField0_ & 0x00000001) == 0x00000001); } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ - public akka.stream.remote.StreamRefContainers.ActorRef getOriginRef() { + public akka.stream.StreamRefMessages.ActorRef getOriginRef() { if (originRefBuilder_ == null) { return originRef_; } else { @@ -1069,13 +948,8 @@ public final class StreamRefContainers { } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ - public Builder setOriginRef(akka.stream.remote.StreamRefContainers.ActorRef value) { + public Builder setOriginRef(akka.stream.StreamRefMessages.ActorRef value) { if (originRefBuilder_ == null) { if (value == null) { throw new NullPointerException(); @@ -1090,14 +964,9 @@ public final class StreamRefContainers { } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ public Builder setOriginRef( - akka.stream.remote.StreamRefContainers.ActorRef.Builder builderForValue) { + akka.stream.StreamRefMessages.ActorRef.Builder builderForValue) { if (originRefBuilder_ == null) { originRef_ = builderForValue.build(); onChanged(); @@ -1109,18 +978,13 @@ public final class StreamRefContainers { } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ - public Builder mergeOriginRef(akka.stream.remote.StreamRefContainers.ActorRef value) { + public Builder mergeOriginRef(akka.stream.StreamRefMessages.ActorRef value) { if (originRefBuilder_ == null) { if (((bitField0_ & 0x00000001) == 0x00000001) && - originRef_ != akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance()) { + originRef_ != akka.stream.StreamRefMessages.ActorRef.getDefaultInstance()) { originRef_ = - akka.stream.remote.StreamRefContainers.ActorRef.newBuilder(originRef_).mergeFrom(value).buildPartial(); + akka.stream.StreamRefMessages.ActorRef.newBuilder(originRef_).mergeFrom(value).buildPartial(); } else { originRef_ = value; } @@ -1133,15 +997,10 @@ public final class StreamRefContainers { } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ public Builder clearOriginRef() { if (originRefBuilder_ == null) { - originRef_ = akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + originRef_ = akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); onChanged(); } else { originRefBuilder_.clear(); @@ -1151,26 +1010,16 @@ public final class StreamRefContainers { } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ - public akka.stream.remote.StreamRefContainers.ActorRef.Builder getOriginRefBuilder() { + public akka.stream.StreamRefMessages.ActorRef.Builder getOriginRefBuilder() { bitField0_ |= 0x00000001; onChanged(); return getOriginRefFieldBuilder().getBuilder(); } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ - public akka.stream.remote.StreamRefContainers.ActorRefOrBuilder getOriginRefOrBuilder() { + public akka.stream.StreamRefMessages.ActorRefOrBuilder getOriginRefOrBuilder() { if (originRefBuilder_ != null) { return originRefBuilder_.getMessageOrBuilder(); } else { @@ -1179,18 +1028,13 @@ public final class StreamRefContainers { } /** * required .ActorRef originRef = 1; - * - *
-       * FIXME: it's basically SinkRef since we just ommit the optional initial demand...
-       * FIXME: could it be that all those passable refs should be expressed internally as a StreamRef?
-       * 
*/ private akka.protobuf.SingleFieldBuilder< - akka.stream.remote.StreamRefContainers.ActorRef, akka.stream.remote.StreamRefContainers.ActorRef.Builder, akka.stream.remote.StreamRefContainers.ActorRefOrBuilder> + akka.stream.StreamRefMessages.ActorRef, akka.stream.StreamRefMessages.ActorRef.Builder, akka.stream.StreamRefMessages.ActorRefOrBuilder> getOriginRefFieldBuilder() { if (originRefBuilder_ == null) { originRefBuilder_ = new akka.protobuf.SingleFieldBuilder< - akka.stream.remote.StreamRefContainers.ActorRef, akka.stream.remote.StreamRefContainers.ActorRef.Builder, akka.stream.remote.StreamRefContainers.ActorRefOrBuilder>( + akka.stream.StreamRefMessages.ActorRef, akka.stream.StreamRefMessages.ActorRef.Builder, akka.stream.StreamRefMessages.ActorRefOrBuilder>( originRef_, getParentForChildren(), isClean()); @@ -1298,14 +1142,14 @@ public final class StreamRefContainers { } public static final akka.protobuf.Descriptors.Descriptor getDescriptor() { - return akka.stream.remote.StreamRefContainers.internal_static_ActorRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_ActorRef_descriptor; } protected akka.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return akka.stream.remote.StreamRefContainers.internal_static_ActorRef_fieldAccessorTable + return akka.stream.StreamRefMessages.internal_static_ActorRef_fieldAccessorTable .ensureFieldAccessorsInitialized( - akka.stream.remote.StreamRefContainers.ActorRef.class, akka.stream.remote.StreamRefContainers.ActorRef.Builder.class); + akka.stream.StreamRefMessages.ActorRef.class, akka.stream.StreamRefMessages.ActorRef.Builder.class); } public static akka.protobuf.Parser PARSER = @@ -1414,53 +1258,53 @@ public final class StreamRefContainers { return super.writeReplace(); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom( + public static akka.stream.StreamRefMessages.ActorRef parseFrom( akka.protobuf.ByteString data) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom( + public static akka.stream.StreamRefMessages.ActorRef parseFrom( akka.protobuf.ByteString data, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom(byte[] data) + public static akka.stream.StreamRefMessages.ActorRef parseFrom(byte[] data) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom( + public static akka.stream.StreamRefMessages.ActorRef parseFrom( byte[] data, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws akka.protobuf.InvalidProtocolBufferException { return PARSER.parseFrom(data, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom(java.io.InputStream input) + public static akka.stream.StreamRefMessages.ActorRef parseFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom( + public static akka.stream.StreamRefMessages.ActorRef parseFrom( java.io.InputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseFrom(input, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseDelimitedFrom(java.io.InputStream input) + public static akka.stream.StreamRefMessages.ActorRef parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { return PARSER.parseDelimitedFrom(input); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseDelimitedFrom( + public static akka.stream.StreamRefMessages.ActorRef parseDelimitedFrom( java.io.InputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { return PARSER.parseDelimitedFrom(input, extensionRegistry); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom( + public static akka.stream.StreamRefMessages.ActorRef parseFrom( akka.protobuf.CodedInputStream input) throws java.io.IOException { return PARSER.parseFrom(input); } - public static akka.stream.remote.StreamRefContainers.ActorRef parseFrom( + public static akka.stream.StreamRefMessages.ActorRef parseFrom( akka.protobuf.CodedInputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { @@ -1469,7 +1313,7 @@ public final class StreamRefContainers { public static Builder newBuilder() { return Builder.create(); } public Builder newBuilderForType() { return newBuilder(); } - public static Builder newBuilder(akka.stream.remote.StreamRefContainers.ActorRef prototype) { + public static Builder newBuilder(akka.stream.StreamRefMessages.ActorRef prototype) { return newBuilder().mergeFrom(prototype); } public Builder toBuilder() { return newBuilder(this); } @@ -1485,20 +1329,20 @@ public final class StreamRefContainers { */ public static final class Builder extends akka.protobuf.GeneratedMessage.Builder - implements akka.stream.remote.StreamRefContainers.ActorRefOrBuilder { + implements akka.stream.StreamRefMessages.ActorRefOrBuilder { public static final akka.protobuf.Descriptors.Descriptor getDescriptor() { - return akka.stream.remote.StreamRefContainers.internal_static_ActorRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_ActorRef_descriptor; } protected akka.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() { - return akka.stream.remote.StreamRefContainers.internal_static_ActorRef_fieldAccessorTable + return akka.stream.StreamRefMessages.internal_static_ActorRef_fieldAccessorTable .ensureFieldAccessorsInitialized( - akka.stream.remote.StreamRefContainers.ActorRef.class, akka.stream.remote.StreamRefContainers.ActorRef.Builder.class); + akka.stream.StreamRefMessages.ActorRef.class, akka.stream.StreamRefMessages.ActorRef.Builder.class); } - // Construct using akka.stream.remote.StreamRefContainers.ActorRef.newBuilder() + // Construct using akka.stream.StreamRefMessages.ActorRef.newBuilder() private Builder() { maybeForceBuilderInitialization(); } @@ -1529,23 +1373,23 @@ public final class StreamRefContainers { public akka.protobuf.Descriptors.Descriptor getDescriptorForType() { - return akka.stream.remote.StreamRefContainers.internal_static_ActorRef_descriptor; + return akka.stream.StreamRefMessages.internal_static_ActorRef_descriptor; } - public akka.stream.remote.StreamRefContainers.ActorRef getDefaultInstanceForType() { - return akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance(); + public akka.stream.StreamRefMessages.ActorRef getDefaultInstanceForType() { + return akka.stream.StreamRefMessages.ActorRef.getDefaultInstance(); } - public akka.stream.remote.StreamRefContainers.ActorRef build() { - akka.stream.remote.StreamRefContainers.ActorRef result = buildPartial(); + public akka.stream.StreamRefMessages.ActorRef build() { + akka.stream.StreamRefMessages.ActorRef result = buildPartial(); if (!result.isInitialized()) { throw newUninitializedMessageException(result); } return result; } - public akka.stream.remote.StreamRefContainers.ActorRef buildPartial() { - akka.stream.remote.StreamRefContainers.ActorRef result = new akka.stream.remote.StreamRefContainers.ActorRef(this); + public akka.stream.StreamRefMessages.ActorRef buildPartial() { + akka.stream.StreamRefMessages.ActorRef result = new akka.stream.StreamRefMessages.ActorRef(this); int from_bitField0_ = bitField0_; int to_bitField0_ = 0; if (((from_bitField0_ & 0x00000001) == 0x00000001)) { @@ -1558,16 +1402,16 @@ public final class StreamRefContainers { } public Builder mergeFrom(akka.protobuf.Message other) { - if (other instanceof akka.stream.remote.StreamRefContainers.ActorRef) { - return mergeFrom((akka.stream.remote.StreamRefContainers.ActorRef)other); + if (other instanceof akka.stream.StreamRefMessages.ActorRef) { + return mergeFrom((akka.stream.StreamRefMessages.ActorRef)other); } else { super.mergeFrom(other); return this; } } - public Builder mergeFrom(akka.stream.remote.StreamRefContainers.ActorRef other) { - if (other == akka.stream.remote.StreamRefContainers.ActorRef.getDefaultInstance()) return this; + public Builder mergeFrom(akka.stream.StreamRefMessages.ActorRef other) { + if (other == akka.stream.StreamRefMessages.ActorRef.getDefaultInstance()) return this; if (other.hasPath()) { bitField0_ |= 0x00000001; path_ = other.path_; @@ -1589,11 +1433,11 @@ public final class StreamRefContainers { akka.protobuf.CodedInputStream input, akka.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException { - akka.stream.remote.StreamRefContainers.ActorRef parsedMessage = null; + akka.stream.StreamRefMessages.ActorRef parsedMessage = null; try { parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); } catch (akka.protobuf.InvalidProtocolBufferException e) { - parsedMessage = (akka.stream.remote.StreamRefContainers.ActorRef) e.getUnfinishedMessage(); + parsedMessage = (akka.stream.StreamRefMessages.ActorRef) e.getUnfinishedMessage(); throw e; } finally { if (parsedMessage != null) { @@ -1689,525 +1533,6 @@ public final class StreamRefContainers { // @@protoc_insertion_point(class_scope:ActorRef) } - public interface OptionOrBuilder - extends akka.protobuf.MessageOrBuilder { - - // optional .Payload value = 1; - /** - * optional .Payload value = 1; - */ - boolean hasValue(); - /** - * optional .Payload value = 1; - */ - akka.stream.remote.StreamRefContainers.Payload getValue(); - /** - * optional .Payload value = 1; - */ - akka.stream.remote.StreamRefContainers.PayloadOrBuilder getValueOrBuilder(); - } - /** - * Protobuf type {@code Option} - */ - public static final class Option extends - akka.protobuf.GeneratedMessage - implements OptionOrBuilder { - // Use Option.newBuilder() to construct. - private Option(akka.protobuf.GeneratedMessage.Builder builder) { - super(builder); - this.unknownFields = builder.getUnknownFields(); - } - private Option(boolean noInit) { this.unknownFields = akka.protobuf.UnknownFieldSet.getDefaultInstance(); } - - private static final Option defaultInstance; - public static Option getDefaultInstance() { - return defaultInstance; - } - - public Option getDefaultInstanceForType() { - return defaultInstance; - } - - private final akka.protobuf.UnknownFieldSet unknownFields; - @java.lang.Override - public final akka.protobuf.UnknownFieldSet - getUnknownFields() { - return this.unknownFields; - } - private Option( - akka.protobuf.CodedInputStream input, - akka.protobuf.ExtensionRegistryLite extensionRegistry) - throws akka.protobuf.InvalidProtocolBufferException { - initFields(); - int mutable_bitField0_ = 0; - akka.protobuf.UnknownFieldSet.Builder unknownFields = - akka.protobuf.UnknownFieldSet.newBuilder(); - try { - boolean done = false; - while (!done) { - int tag = input.readTag(); - switch (tag) { - case 0: - done = true; - break; - default: { - if (!parseUnknownField(input, unknownFields, - extensionRegistry, tag)) { - done = true; - } - break; - } - case 10: { - akka.stream.remote.StreamRefContainers.Payload.Builder subBuilder = null; - if (((bitField0_ & 0x00000001) == 0x00000001)) { - subBuilder = value_.toBuilder(); - } - value_ = input.readMessage(akka.stream.remote.StreamRefContainers.Payload.PARSER, extensionRegistry); - if (subBuilder != null) { - subBuilder.mergeFrom(value_); - value_ = subBuilder.buildPartial(); - } - bitField0_ |= 0x00000001; - break; - } - } - } - } catch (akka.protobuf.InvalidProtocolBufferException e) { - throw e.setUnfinishedMessage(this); - } catch (java.io.IOException e) { - throw new akka.protobuf.InvalidProtocolBufferException( - e.getMessage()).setUnfinishedMessage(this); - } finally { - this.unknownFields = unknownFields.build(); - makeExtensionsImmutable(); - } - } - public static final akka.protobuf.Descriptors.Descriptor - getDescriptor() { - return akka.stream.remote.StreamRefContainers.internal_static_Option_descriptor; - } - - protected akka.protobuf.GeneratedMessage.FieldAccessorTable - internalGetFieldAccessorTable() { - return akka.stream.remote.StreamRefContainers.internal_static_Option_fieldAccessorTable - .ensureFieldAccessorsInitialized( - akka.stream.remote.StreamRefContainers.Option.class, akka.stream.remote.StreamRefContainers.Option.Builder.class); - } - - public static akka.protobuf.Parser