Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 05E49200CCB for ; Thu, 6 Jul 2017 07:31:10 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 04490165630; Thu, 6 Jul 2017 05:31:10 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 8509A16561F for ; Thu, 6 Jul 2017 07:31:07 +0200 (CEST) Received: (qmail 64460 invoked by uid 500); 6 Jul 2017 05:31:06 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 61389 invoked by uid 99); 6 Jul 2017 05:31:03 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 06 Jul 2017 05:31:03 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id DD379F5509; Thu, 6 Jul 2017 05:31:02 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: busbey@apache.org To: commits@hbase.apache.org Date: Thu, 06 Jul 2017 05:31:18 -0000 Message-Id: <155cacf961db4d9f98af4d9d588c3410@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [17/52] [abbrv] [partial] hbase git commit: HBASE-17056 Remove checked in PB generated files Selective add of dependency on hbase-thirdparty jars. Update to READMEs on how protobuf is done (and update to refguide) Removed all checked in generated protobu archived-at: Thu, 06 Jul 2017 05:31:10 -0000 http://git-wip-us.apache.org/repos/asf/hbase/blob/df93c13f/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilder.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilder.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilder.java deleted file mode 100644 index 8968a70..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilder.java +++ /dev/null @@ -1,708 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -import java.util.AbstractList; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * {@code RepeatedFieldBuilder} implements a structure that a protocol - * message uses to hold a repeated field of other protocol messages. It supports - * the classical use case of adding immutable {@link Message}'s to the - * repeated field and is highly optimized around this (no extra memory - * allocations and sharing of immutable arrays). - *
- * It also supports the additional use case of adding a {@link Message.Builder} - * to the repeated field and deferring conversion of that {@code Builder} - * to an immutable {@code Message}. In this way, it's possible to maintain - * a tree of {@code Builder}'s that acts as a fully read/write data - * structure. - *
- * Logically, one can think of a tree of builders as converting the entire tree - * to messages when build is called on the root or when any method is called - * that desires a Message instead of a Builder. In terms of the implementation, - * the {@code SingleFieldBuilder} and {@code RepeatedFieldBuilder} - * classes cache messages that were created so that messages only need to be - * created when some change occurred in its builder or a builder for one of its - * descendants. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - * - * @author jonp@google.com (Jon Perlow) - */ -public class RepeatedFieldBuilder - - implements GeneratedMessage.BuilderParent { - - // Parent to send changes to. - private GeneratedMessage.BuilderParent parent; - - // List of messages. Never null. It may be immutable, in which case - // isMessagesListMutable will be false. See note below. - private List messages; - - // Whether messages is an mutable array that can be modified. - private boolean isMessagesListMutable; - - // List of builders. May be null, in which case, no nested builders were - // created. If not null, entries represent the builder for that index. - private List> builders; - - // Here are the invariants for messages and builders: - // 1. messages is never null and its count corresponds to the number of items - // in the repeated field. - // 2. If builders is non-null, messages and builders MUST always - // contain the same number of items. - // 3. Entries in either array can be null, but for any index, there MUST be - // either a Message in messages or a builder in builders. - // 4. If the builder at an index is non-null, the builder is - // authoritative. This is the case where a Builder was set on the index. - // Any message in the messages array MUST be ignored. - // t. If the builder at an index is null, the message in the messages - // list is authoritative. This is the case where a Message (not a Builder) - // was set directly for an index. - - // Indicates that we've built a message and so we are now obligated - // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener. - private boolean isClean; - - // A view of this builder that exposes a List interface of messages. This is - // initialized on demand. This is fully backed by this object and all changes - // are reflected in it. Access to any item converts it to a message if it - // was a builder. - private MessageExternalList externalMessageList; - - // A view of this builder that exposes a List interface of builders. This is - // initialized on demand. This is fully backed by this object and all changes - // are reflected in it. Access to any item converts it to a builder if it - // was a message. - private BuilderExternalList externalBuilderList; - - // A view of this builder that exposes a List interface of the interface - // implemented by messages and builders. This is initialized on demand. This - // is fully backed by this object and all changes are reflected in it. - // Access to any item returns either a builder or message depending on - // what is most efficient. - private MessageOrBuilderExternalList - externalMessageOrBuilderList; - - /** - * Constructs a new builder with an empty list of messages. - * - * @param messages the current list of messages - * @param isMessagesListMutable Whether the messages list is mutable - * @param parent a listener to notify of changes - * @param isClean whether the builder is initially marked clean - */ - public RepeatedFieldBuilder( - List messages, - boolean isMessagesListMutable, - GeneratedMessage.BuilderParent parent, - boolean isClean) { - this.messages = messages; - this.isMessagesListMutable = isMessagesListMutable; - this.parent = parent; - this.isClean = isClean; - } - - public void dispose() { - // Null out parent so we stop sending it invalidations. - parent = null; - } - - /** - * Ensures that the list of messages is mutable so it can be updated. If it's - * immutable, a copy is made. - */ - private void ensureMutableMessageList() { - if (!isMessagesListMutable) { - messages = new ArrayList(messages); - isMessagesListMutable = true; - } - } - - /** - * Ensures that the list of builders is not null. If it's null, the list is - * created and initialized to be the same size as the messages list with - * null entries. - */ - private void ensureBuilders() { - if (this.builders == null) { - this.builders = - new ArrayList>( - messages.size()); - for (int i = 0; i < messages.size(); i++) { - builders.add(null); - } - } - } - - /** - * Gets the count of items in the list. - * - * @return the count of items in the list. - */ - public int getCount() { - return messages.size(); - } - - /** - * Gets whether the list is empty. - * - * @return whether the list is empty - */ - public boolean isEmpty() { - return messages.isEmpty(); - } - - /** - * Get the message at the specified index. If the message is currently stored - * as a {@code Builder}, it is converted to a {@code Message} by - * calling {@link Message.Builder#buildPartial} on it. - * - * @param index the index of the message to get - * @return the message for the specified index - */ - public MType getMessage(int index) { - return getMessage(index, false); - } - - /** - * Get the message at the specified index. If the message is currently stored - * as a {@code Builder}, it is converted to a {@code Message} by - * calling {@link Message.Builder#buildPartial} on it. - * - * @param index the index of the message to get - * @param forBuild this is being called for build so we want to make sure - * we SingleFieldBuilder.build to send dirty invalidations - * @return the message for the specified index - */ - private MType getMessage(int index, boolean forBuild) { - if (this.builders == null) { - // We don't have any builders -- return the current Message. - // This is the case where no builder was created, so we MUST have a - // Message. - return messages.get(index); - } - - SingleFieldBuilder builder = builders.get(index); - if (builder == null) { - // We don't have a builder -- return the current message. - // This is the case where no builder was created for the entry at index, - // so we MUST have a message. - return messages.get(index); - - } else { - return forBuild ? builder.build() : builder.getMessage(); - } - } - - /** - * Gets a builder for the specified index. If no builder has been created for - * that index, a builder is created on demand by calling - * {@link Message#toBuilder}. - * - * @param index the index of the message to get - * @return The builder for that index - */ - public BType getBuilder(int index) { - ensureBuilders(); - SingleFieldBuilder builder = builders.get(index); - if (builder == null) { - MType message = messages.get(index); - builder = new SingleFieldBuilder( - message, this, isClean); - builders.set(index, builder); - } - return builder.getBuilder(); - } - - /** - * Gets the base class interface for the specified index. This may either be - * a builder or a message. It will return whatever is more efficient. - * - * @param index the index of the message to get - * @return the message or builder for the index as the base class interface - */ - @SuppressWarnings("unchecked") - public IType getMessageOrBuilder(int index) { - if (this.builders == null) { - // We don't have any builders -- return the current Message. - // This is the case where no builder was created, so we MUST have a - // Message. - return (IType) messages.get(index); - } - - SingleFieldBuilder builder = builders.get(index); - if (builder == null) { - // We don't have a builder -- return the current message. - // This is the case where no builder was created for the entry at index, - // so we MUST have a message. - return (IType) messages.get(index); - - } else { - return builder.getMessageOrBuilder(); - } - } - - /** - * Sets a message at the specified index replacing the existing item at - * that index. - * - * @param index the index to set. - * @param message the message to set - * @return the builder - */ - public RepeatedFieldBuilder setMessage( - int index, MType message) { - if (message == null) { - throw new NullPointerException(); - } - ensureMutableMessageList(); - messages.set(index, message); - if (builders != null) { - SingleFieldBuilder entry = - builders.set(index, null); - if (entry != null) { - entry.dispose(); - } - } - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Appends the specified element to the end of this list. - * - * @param message the message to add - * @return the builder - */ - public RepeatedFieldBuilder addMessage( - MType message) { - if (message == null) { - throw new NullPointerException(); - } - ensureMutableMessageList(); - messages.add(message); - if (builders != null) { - builders.add(null); - } - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Inserts the specified message at the specified position in this list. - * Shifts the element currently at that position (if any) and any subsequent - * elements to the right (adds one to their indices). - * - * @param index the index at which to insert the message - * @param message the message to add - * @return the builder - */ - public RepeatedFieldBuilder addMessage( - int index, MType message) { - if (message == null) { - throw new NullPointerException(); - } - ensureMutableMessageList(); - messages.add(index, message); - if (builders != null) { - builders.add(index, null); - } - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Appends all of the messages in the specified collection to the end of - * this list, in the order that they are returned by the specified - * collection's iterator. - * - * @param values the messages to add - * @return the builder - */ - public RepeatedFieldBuilder addAllMessages( - Iterable values) { - for (final MType value : values) { - if (value == null) { - throw new NullPointerException(); - } - } - - // If we can inspect the size, we can more efficiently add messages. - int size = -1; - if (values instanceof Collection) { - @SuppressWarnings("unchecked") final - Collection collection = (Collection) values; - if (collection.size() == 0) { - return this; - } - size = collection.size(); - } - ensureMutableMessageList(); - - if (size >= 0 && messages instanceof ArrayList) { - ((ArrayList) messages) - .ensureCapacity(messages.size() + size); - } - - for (MType value : values) { - addMessage(value); - } - - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Appends a new builder to the end of this list and returns the builder. - * - * @param message the message to add which is the basis of the builder - * @return the new builder - */ - public BType addBuilder(MType message) { - ensureMutableMessageList(); - ensureBuilders(); - SingleFieldBuilder builder = - new SingleFieldBuilder( - message, this, isClean); - messages.add(null); - builders.add(builder); - onChanged(); - incrementModCounts(); - return builder.getBuilder(); - } - - /** - * Inserts a new builder at the specified position in this list. - * Shifts the element currently at that position (if any) and any subsequent - * elements to the right (adds one to their indices). - * - * @param index the index at which to insert the builder - * @param message the message to add which is the basis of the builder - * @return the builder - */ - public BType addBuilder(int index, MType message) { - ensureMutableMessageList(); - ensureBuilders(); - SingleFieldBuilder builder = - new SingleFieldBuilder( - message, this, isClean); - messages.add(index, null); - builders.add(index, builder); - onChanged(); - incrementModCounts(); - return builder.getBuilder(); - } - - /** - * Removes the element at the specified position in this list. Shifts any - * subsequent elements to the left (subtracts one from their indices). - * Returns the element that was removed from the list. - * - * @param index the index at which to remove the message - */ - public void remove(int index) { - ensureMutableMessageList(); - messages.remove(index); - if (builders != null) { - SingleFieldBuilder entry = - builders.remove(index); - if (entry != null) { - entry.dispose(); - } - } - onChanged(); - incrementModCounts(); - } - - /** - * Removes all of the elements from this list. - * The list will be empty after this call returns. - */ - public void clear() { - messages = Collections.emptyList(); - isMessagesListMutable = false; - if (builders != null) { - for (SingleFieldBuilder entry : - builders) { - if (entry != null) { - entry.dispose(); - } - } - builders = null; - } - onChanged(); - incrementModCounts(); - } - - /** - * Builds the list of messages from the builder and returns them. - * - * @return an immutable list of messages - */ - public List build() { - // Now that build has been called, we are required to dispatch - // invalidations. - isClean = true; - - if (!isMessagesListMutable && builders == null) { - // We still have an immutable list and we never created a builder. - return messages; - } - - boolean allMessagesInSync = true; - if (!isMessagesListMutable) { - // We still have an immutable list. Let's see if any of them are out - // of sync with their builders. - for (int i = 0; i < messages.size(); i++) { - Message message = messages.get(i); - SingleFieldBuilder builder = builders.get(i); - if (builder != null) { - if (builder.build() != message) { - allMessagesInSync = false; - break; - } - } - } - if (allMessagesInSync) { - // Immutable list is still in sync. - return messages; - } - } - - // Need to make sure messages is up to date - ensureMutableMessageList(); - for (int i = 0; i < messages.size(); i++) { - messages.set(i, getMessage(i, true)); - } - - // We're going to return our list as immutable so we mark that we can - // no longer update it. - messages = Collections.unmodifiableList(messages); - isMessagesListMutable = false; - return messages; - } - - /** - * Gets a view of the builder as a list of messages. The returned list is live - * and will reflect any changes to the underlying builder. - * - * @return the messages in the list - */ - public List getMessageList() { - if (externalMessageList == null) { - externalMessageList = - new MessageExternalList(this); - } - return externalMessageList; - } - - /** - * Gets a view of the builder as a list of builders. This returned list is - * live and will reflect any changes to the underlying builder. - * - * @return the builders in the list - */ - public List getBuilderList() { - if (externalBuilderList == null) { - externalBuilderList = - new BuilderExternalList(this); - } - return externalBuilderList; - } - - /** - * Gets a view of the builder as a list of MessageOrBuilders. This returned - * list is live and will reflect any changes to the underlying builder. - * - * @return the builders in the list - */ - public List getMessageOrBuilderList() { - if (externalMessageOrBuilderList == null) { - externalMessageOrBuilderList = - new MessageOrBuilderExternalList(this); - } - return externalMessageOrBuilderList; - } - - /** - * Called when a the builder or one of its nested children has changed - * and any parent should be notified of its invalidation. - */ - private void onChanged() { - if (isClean && parent != null) { - parent.markDirty(); - - // Don't keep dispatching invalidations until build is called again. - isClean = false; - } - } - - @Override - public void markDirty() { - onChanged(); - } - - /** - * Increments the mod counts so that an ConcurrentModificationException can - * be thrown if calling code tries to modify the builder while its iterating - * the list. - */ - private void incrementModCounts() { - if (externalMessageList != null) { - externalMessageList.incrementModCount(); - } - if (externalBuilderList != null) { - externalBuilderList.incrementModCount(); - } - if (externalMessageOrBuilderList != null) { - externalMessageOrBuilderList.incrementModCount(); - } - } - - /** - * Provides a live view of the builder as a list of messages. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - */ - private static class MessageExternalList< - MType extends GeneratedMessage, - BType extends GeneratedMessage.Builder, - IType extends MessageOrBuilder> - extends AbstractList implements List { - - RepeatedFieldBuilder builder; - - MessageExternalList( - RepeatedFieldBuilder builder) { - this.builder = builder; - } - - @Override - public int size() { - return this.builder.getCount(); - } - - @Override - public MType get(int index) { - return builder.getMessage(index); - } - - void incrementModCount() { - modCount++; - } - } - - /** - * Provides a live view of the builder as a list of builders. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - */ - private static class BuilderExternalList< - MType extends GeneratedMessage, - BType extends GeneratedMessage.Builder, - IType extends MessageOrBuilder> - extends AbstractList implements List { - - RepeatedFieldBuilder builder; - - BuilderExternalList( - RepeatedFieldBuilder builder) { - this.builder = builder; - } - - @Override - public int size() { - return this.builder.getCount(); - } - - @Override - public BType get(int index) { - return builder.getBuilder(index); - } - - void incrementModCount() { - modCount++; - } - } - - /** - * Provides a live view of the builder as a list of builders. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - */ - private static class MessageOrBuilderExternalList< - MType extends GeneratedMessage, - BType extends GeneratedMessage.Builder, - IType extends MessageOrBuilder> - extends AbstractList implements List { - - RepeatedFieldBuilder builder; - - MessageOrBuilderExternalList( - RepeatedFieldBuilder builder) { - this.builder = builder; - } - - @Override - public int size() { - return this.builder.getCount(); - } - - @Override - public IType get(int index) { - return builder.getMessageOrBuilder(index); - } - - void incrementModCount() { - modCount++; - } - } -} http://git-wip-us.apache.org/repos/asf/hbase/blob/df93c13f/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilderV3.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilderV3.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilderV3.java deleted file mode 100644 index 9963e05..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RepeatedFieldBuilderV3.java +++ /dev/null @@ -1,708 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -import java.util.AbstractList; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * {@code RepeatedFieldBuilderV3} implements a structure that a protocol - * message uses to hold a repeated field of other protocol messages. It supports - * the classical use case of adding immutable {@link Message}'s to the - * repeated field and is highly optimized around this (no extra memory - * allocations and sharing of immutable arrays). - *
- * It also supports the additional use case of adding a {@link Message.Builder} - * to the repeated field and deferring conversion of that {@code Builder} - * to an immutable {@code Message}. In this way, it's possible to maintain - * a tree of {@code Builder}'s that acts as a fully read/write data - * structure. - *
- * Logically, one can think of a tree of builders as converting the entire tree - * to messages when build is called on the root or when any method is called - * that desires a Message instead of a Builder. In terms of the implementation, - * the {@code SingleFieldBuilderV3} and {@code RepeatedFieldBuilderV3} - * classes cache messages that were created so that messages only need to be - * created when some change occurred in its builder or a builder for one of its - * descendants. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - * - * @author jonp@google.com (Jon Perlow) - */ -public class RepeatedFieldBuilderV3 - - implements AbstractMessage.BuilderParent { - - // Parent to send changes to. - private AbstractMessage.BuilderParent parent; - - // List of messages. Never null. It may be immutable, in which case - // isMessagesListMutable will be false. See note below. - private List messages; - - // Whether messages is an mutable array that can be modified. - private boolean isMessagesListMutable; - - // List of builders. May be null, in which case, no nested builders were - // created. If not null, entries represent the builder for that index. - private List> builders; - - // Here are the invariants for messages and builders: - // 1. messages is never null and its count corresponds to the number of items - // in the repeated field. - // 2. If builders is non-null, messages and builders MUST always - // contain the same number of items. - // 3. Entries in either array can be null, but for any index, there MUST be - // either a Message in messages or a builder in builders. - // 4. If the builder at an index is non-null, the builder is - // authoritative. This is the case where a Builder was set on the index. - // Any message in the messages array MUST be ignored. - // t. If the builder at an index is null, the message in the messages - // list is authoritative. This is the case where a Message (not a Builder) - // was set directly for an index. - - // Indicates that we've built a message and so we are now obligated - // to dispatch dirty invalidations. See AbstractMessage.BuilderListener. - private boolean isClean; - - // A view of this builder that exposes a List interface of messages. This is - // initialized on demand. This is fully backed by this object and all changes - // are reflected in it. Access to any item converts it to a message if it - // was a builder. - private MessageExternalList externalMessageList; - - // A view of this builder that exposes a List interface of builders. This is - // initialized on demand. This is fully backed by this object and all changes - // are reflected in it. Access to any item converts it to a builder if it - // was a message. - private BuilderExternalList externalBuilderList; - - // A view of this builder that exposes a List interface of the interface - // implemented by messages and builders. This is initialized on demand. This - // is fully backed by this object and all changes are reflected in it. - // Access to any item returns either a builder or message depending on - // what is most efficient. - private MessageOrBuilderExternalList - externalMessageOrBuilderList; - - /** - * Constructs a new builder with an empty list of messages. - * - * @param messages the current list of messages - * @param isMessagesListMutable Whether the messages list is mutable - * @param parent a listener to notify of changes - * @param isClean whether the builder is initially marked clean - */ - public RepeatedFieldBuilderV3( - List messages, - boolean isMessagesListMutable, - AbstractMessage.BuilderParent parent, - boolean isClean) { - this.messages = messages; - this.isMessagesListMutable = isMessagesListMutable; - this.parent = parent; - this.isClean = isClean; - } - - public void dispose() { - // Null out parent so we stop sending it invalidations. - parent = null; - } - - /** - * Ensures that the list of messages is mutable so it can be updated. If it's - * immutable, a copy is made. - */ - private void ensureMutableMessageList() { - if (!isMessagesListMutable) { - messages = new ArrayList(messages); - isMessagesListMutable = true; - } - } - - /** - * Ensures that the list of builders is not null. If it's null, the list is - * created and initialized to be the same size as the messages list with - * null entries. - */ - private void ensureBuilders() { - if (this.builders == null) { - this.builders = - new ArrayList>( - messages.size()); - for (int i = 0; i < messages.size(); i++) { - builders.add(null); - } - } - } - - /** - * Gets the count of items in the list. - * - * @return the count of items in the list. - */ - public int getCount() { - return messages.size(); - } - - /** - * Gets whether the list is empty. - * - * @return whether the list is empty - */ - public boolean isEmpty() { - return messages.isEmpty(); - } - - /** - * Get the message at the specified index. If the message is currently stored - * as a {@code Builder}, it is converted to a {@code Message} by - * calling {@link Message.Builder#buildPartial} on it. - * - * @param index the index of the message to get - * @return the message for the specified index - */ - public MType getMessage(int index) { - return getMessage(index, false); - } - - /** - * Get the message at the specified index. If the message is currently stored - * as a {@code Builder}, it is converted to a {@code Message} by - * calling {@link Message.Builder#buildPartial} on it. - * - * @param index the index of the message to get - * @param forBuild this is being called for build so we want to make sure - * we SingleFieldBuilderV3.build to send dirty invalidations - * @return the message for the specified index - */ - private MType getMessage(int index, boolean forBuild) { - if (this.builders == null) { - // We don't have any builders -- return the current Message. - // This is the case where no builder was created, so we MUST have a - // Message. - return messages.get(index); - } - - SingleFieldBuilderV3 builder = builders.get(index); - if (builder == null) { - // We don't have a builder -- return the current message. - // This is the case where no builder was created for the entry at index, - // so we MUST have a message. - return messages.get(index); - - } else { - return forBuild ? builder.build() : builder.getMessage(); - } - } - - /** - * Gets a builder for the specified index. If no builder has been created for - * that index, a builder is created on demand by calling - * {@link Message#toBuilder}. - * - * @param index the index of the message to get - * @return The builder for that index - */ - public BType getBuilder(int index) { - ensureBuilders(); - SingleFieldBuilderV3 builder = builders.get(index); - if (builder == null) { - MType message = messages.get(index); - builder = new SingleFieldBuilderV3( - message, this, isClean); - builders.set(index, builder); - } - return builder.getBuilder(); - } - - /** - * Gets the base class interface for the specified index. This may either be - * a builder or a message. It will return whatever is more efficient. - * - * @param index the index of the message to get - * @return the message or builder for the index as the base class interface - */ - @SuppressWarnings("unchecked") - public IType getMessageOrBuilder(int index) { - if (this.builders == null) { - // We don't have any builders -- return the current Message. - // This is the case where no builder was created, so we MUST have a - // Message. - return (IType) messages.get(index); - } - - SingleFieldBuilderV3 builder = builders.get(index); - if (builder == null) { - // We don't have a builder -- return the current message. - // This is the case where no builder was created for the entry at index, - // so we MUST have a message. - return (IType) messages.get(index); - - } else { - return builder.getMessageOrBuilder(); - } - } - - /** - * Sets a message at the specified index replacing the existing item at - * that index. - * - * @param index the index to set. - * @param message the message to set - * @return the builder - */ - public RepeatedFieldBuilderV3 setMessage( - int index, MType message) { - if (message == null) { - throw new NullPointerException(); - } - ensureMutableMessageList(); - messages.set(index, message); - if (builders != null) { - SingleFieldBuilderV3 entry = - builders.set(index, null); - if (entry != null) { - entry.dispose(); - } - } - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Appends the specified element to the end of this list. - * - * @param message the message to add - * @return the builder - */ - public RepeatedFieldBuilderV3 addMessage( - MType message) { - if (message == null) { - throw new NullPointerException(); - } - ensureMutableMessageList(); - messages.add(message); - if (builders != null) { - builders.add(null); - } - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Inserts the specified message at the specified position in this list. - * Shifts the element currently at that position (if any) and any subsequent - * elements to the right (adds one to their indices). - * - * @param index the index at which to insert the message - * @param message the message to add - * @return the builder - */ - public RepeatedFieldBuilderV3 addMessage( - int index, MType message) { - if (message == null) { - throw new NullPointerException(); - } - ensureMutableMessageList(); - messages.add(index, message); - if (builders != null) { - builders.add(index, null); - } - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Appends all of the messages in the specified collection to the end of - * this list, in the order that they are returned by the specified - * collection's iterator. - * - * @param values the messages to add - * @return the builder - */ - public RepeatedFieldBuilderV3 addAllMessages( - Iterable values) { - for (final MType value : values) { - if (value == null) { - throw new NullPointerException(); - } - } - - // If we can inspect the size, we can more efficiently add messages. - int size = -1; - if (values instanceof Collection) { - @SuppressWarnings("unchecked") final - Collection collection = (Collection) values; - if (collection.size() == 0) { - return this; - } - size = collection.size(); - } - ensureMutableMessageList(); - - if (size >= 0 && messages instanceof ArrayList) { - ((ArrayList) messages) - .ensureCapacity(messages.size() + size); - } - - for (MType value : values) { - addMessage(value); - } - - onChanged(); - incrementModCounts(); - return this; - } - - /** - * Appends a new builder to the end of this list and returns the builder. - * - * @param message the message to add which is the basis of the builder - * @return the new builder - */ - public BType addBuilder(MType message) { - ensureMutableMessageList(); - ensureBuilders(); - SingleFieldBuilderV3 builder = - new SingleFieldBuilderV3( - message, this, isClean); - messages.add(null); - builders.add(builder); - onChanged(); - incrementModCounts(); - return builder.getBuilder(); - } - - /** - * Inserts a new builder at the specified position in this list. - * Shifts the element currently at that position (if any) and any subsequent - * elements to the right (adds one to their indices). - * - * @param index the index at which to insert the builder - * @param message the message to add which is the basis of the builder - * @return the builder - */ - public BType addBuilder(int index, MType message) { - ensureMutableMessageList(); - ensureBuilders(); - SingleFieldBuilderV3 builder = - new SingleFieldBuilderV3( - message, this, isClean); - messages.add(index, null); - builders.add(index, builder); - onChanged(); - incrementModCounts(); - return builder.getBuilder(); - } - - /** - * Removes the element at the specified position in this list. Shifts any - * subsequent elements to the left (subtracts one from their indices). - * Returns the element that was removed from the list. - * - * @param index the index at which to remove the message - */ - public void remove(int index) { - ensureMutableMessageList(); - messages.remove(index); - if (builders != null) { - SingleFieldBuilderV3 entry = - builders.remove(index); - if (entry != null) { - entry.dispose(); - } - } - onChanged(); - incrementModCounts(); - } - - /** - * Removes all of the elements from this list. - * The list will be empty after this call returns. - */ - public void clear() { - messages = Collections.emptyList(); - isMessagesListMutable = false; - if (builders != null) { - for (SingleFieldBuilderV3 entry : - builders) { - if (entry != null) { - entry.dispose(); - } - } - builders = null; - } - onChanged(); - incrementModCounts(); - } - - /** - * Builds the list of messages from the builder and returns them. - * - * @return an immutable list of messages - */ - public List build() { - // Now that build has been called, we are required to dispatch - // invalidations. - isClean = true; - - if (!isMessagesListMutable && builders == null) { - // We still have an immutable list and we never created a builder. - return messages; - } - - boolean allMessagesInSync = true; - if (!isMessagesListMutable) { - // We still have an immutable list. Let's see if any of them are out - // of sync with their builders. - for (int i = 0; i < messages.size(); i++) { - Message message = messages.get(i); - SingleFieldBuilderV3 builder = builders.get(i); - if (builder != null) { - if (builder.build() != message) { - allMessagesInSync = false; - break; - } - } - } - if (allMessagesInSync) { - // Immutable list is still in sync. - return messages; - } - } - - // Need to make sure messages is up to date - ensureMutableMessageList(); - for (int i = 0; i < messages.size(); i++) { - messages.set(i, getMessage(i, true)); - } - - // We're going to return our list as immutable so we mark that we can - // no longer update it. - messages = Collections.unmodifiableList(messages); - isMessagesListMutable = false; - return messages; - } - - /** - * Gets a view of the builder as a list of messages. The returned list is live - * and will reflect any changes to the underlying builder. - * - * @return the messages in the list - */ - public List getMessageList() { - if (externalMessageList == null) { - externalMessageList = - new MessageExternalList(this); - } - return externalMessageList; - } - - /** - * Gets a view of the builder as a list of builders. This returned list is - * live and will reflect any changes to the underlying builder. - * - * @return the builders in the list - */ - public List getBuilderList() { - if (externalBuilderList == null) { - externalBuilderList = - new BuilderExternalList(this); - } - return externalBuilderList; - } - - /** - * Gets a view of the builder as a list of MessageOrBuilders. This returned - * list is live and will reflect any changes to the underlying builder. - * - * @return the builders in the list - */ - public List getMessageOrBuilderList() { - if (externalMessageOrBuilderList == null) { - externalMessageOrBuilderList = - new MessageOrBuilderExternalList(this); - } - return externalMessageOrBuilderList; - } - - /** - * Called when a the builder or one of its nested children has changed - * and any parent should be notified of its invalidation. - */ - private void onChanged() { - if (isClean && parent != null) { - parent.markDirty(); - - // Don't keep dispatching invalidations until build is called again. - isClean = false; - } - } - - @Override - public void markDirty() { - onChanged(); - } - - /** - * Increments the mod counts so that an ConcurrentModificationException can - * be thrown if calling code tries to modify the builder while its iterating - * the list. - */ - private void incrementModCounts() { - if (externalMessageList != null) { - externalMessageList.incrementModCount(); - } - if (externalBuilderList != null) { - externalBuilderList.incrementModCount(); - } - if (externalMessageOrBuilderList != null) { - externalMessageOrBuilderList.incrementModCount(); - } - } - - /** - * Provides a live view of the builder as a list of messages. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - */ - private static class MessageExternalList< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, - IType extends MessageOrBuilder> - extends AbstractList implements List { - - RepeatedFieldBuilderV3 builder; - - MessageExternalList( - RepeatedFieldBuilderV3 builder) { - this.builder = builder; - } - - @Override - public int size() { - return this.builder.getCount(); - } - - @Override - public MType get(int index) { - return builder.getMessage(index); - } - - void incrementModCount() { - modCount++; - } - } - - /** - * Provides a live view of the builder as a list of builders. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - */ - private static class BuilderExternalList< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, - IType extends MessageOrBuilder> - extends AbstractList implements List { - - RepeatedFieldBuilderV3 builder; - - BuilderExternalList( - RepeatedFieldBuilderV3 builder) { - this.builder = builder; - } - - @Override - public int size() { - return this.builder.getCount(); - } - - @Override - public BType get(int index) { - return builder.getBuilder(index); - } - - void incrementModCount() { - modCount++; - } - } - - /** - * Provides a live view of the builder as a list of builders. - * - * @param the type of message for the field - * @param the type of builder for the field - * @param the common interface for the message and the builder - */ - private static class MessageOrBuilderExternalList< - MType extends AbstractMessage, - BType extends AbstractMessage.Builder, - IType extends MessageOrBuilder> - extends AbstractList implements List { - - RepeatedFieldBuilderV3 builder; - - MessageOrBuilderExternalList( - RepeatedFieldBuilderV3 builder) { - this.builder = builder; - } - - @Override - public int size() { - return this.builder.getCount(); - } - - @Override - public IType get(int index) { - return builder.getMessageOrBuilder(index); - } - - void incrementModCount() { - modCount++; - } - } -} http://git-wip-us.apache.org/repos/asf/hbase/blob/df93c13f/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RopeByteString.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RopeByteString.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RopeByteString.java deleted file mode 100644 index a67ed34..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RopeByteString.java +++ /dev/null @@ -1,897 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InvalidObjectException; -import java.io.ObjectInputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.Stack; - -/** - * Class to represent {@code ByteStrings} formed by concatenation of other - * ByteStrings, without copying the data in the pieces. The concatenation is - * represented as a tree whose leaf nodes are each a - * {@link org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString.LeafByteString}. - * - *

Most of the operation here is inspired by the now-famous paper - * BAP95 Ropes: an Alternative to Strings hans-j. boehm, russ atkinson and - * michael plass - * - *

The algorithms described in the paper have been implemented for character - * strings in {@code com.google.common.string.Rope} and in the c++ class {@code - * cord.cc}. - * - *

Fundamentally the Rope algorithm represents the collection of pieces as a - * binary tree. BAP95 uses a Fibonacci bound relating depth to a minimum - * sequence length, sequences that are too short relative to their depth cause a - * tree rebalance. More precisely, a tree of depth d is "balanced" in the - * terminology of BAP95 if its length is at least F(d+2), where F(n) is the - * n-the Fibonacci number. Thus for depths 0, 1, 2, 3, 4, 5,... we have minimum - * lengths 1, 2, 3, 5, 8, 13,... - * - * @author carlanton@google.com (Carl Haverl) - */ -final class RopeByteString extends ByteString { - - /** - * BAP95. Let Fn be the nth Fibonacci number. A {@link RopeByteString} of - * depth n is "balanced", i.e flat enough, if its length is at least Fn+2, - * e.g. a "balanced" {@link RopeByteString} of depth 1 must have length at - * least 2, of depth 4 must have length >= 8, etc. - * - *

There's nothing special about using the Fibonacci numbers for this, but - * they are a reasonable sequence for encapsulating the idea that we are OK - * with longer strings being encoded in deeper binary trees. - * - *

For 32-bit integers, this array has length 46. - */ - private static final int[] minLengthByDepth; - - static { - // Dynamically generate the list of Fibonacci numbers the first time this - // class is accessed. - List numbers = new ArrayList(); - - // we skip the first Fibonacci number (1). So instead of: 1 1 2 3 5 8 ... - // we have: 1 2 3 5 8 ... - int f1 = 1; - int f2 = 1; - - // get all the values until we roll over. - while (f2 > 0) { - numbers.add(f2); - int temp = f1 + f2; - f1 = f2; - f2 = temp; - } - - // we include this here so that we can index this array to [x + 1] in the - // loops below. - numbers.add(Integer.MAX_VALUE); - minLengthByDepth = new int[numbers.size()]; - for (int i = 0; i < minLengthByDepth.length; i++) { - // unbox all the values - minLengthByDepth[i] = numbers.get(i); - } - } - - private final int totalLength; - private final ByteString left; - private final ByteString right; - private final int leftLength; - private final int treeDepth; - - /** - * Create a new RopeByteString, which can be thought of as a new tree node, by - * recording references to the two given strings. - * - * @param left string on the left of this node, should have {@code size() > - * 0} - * @param right string on the right of this node, should have {@code size() > - * 0} - */ - private RopeByteString(ByteString left, ByteString right) { - this.left = left; - this.right = right; - leftLength = left.size(); - totalLength = leftLength + right.size(); - treeDepth = Math.max(left.getTreeDepth(), right.getTreeDepth()) + 1; - } - - /** - * Concatenate the given strings while performing various optimizations to - * slow the growth rate of tree depth and tree node count. The result is - * either a {@link org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString.LeafByteString} or a - * {@link RopeByteString} depending on which optimizations, if any, were - * applied. - * - *

Small pieces of length less than {@link - * ByteString#CONCATENATE_BY_COPY_SIZE} may be copied by value here, as in - * BAP95. Large pieces are referenced without copy. - * - * @param left string on the left - * @param right string on the right - * @return concatenation representing the same sequence as the given strings - */ - static ByteString concatenate(ByteString left, ByteString right) { - if (right.size() == 0) { - return left; - } - - if (left.size() == 0) { - return right; - } - - final int newLength = left.size() + right.size(); - if (newLength < ByteString.CONCATENATE_BY_COPY_SIZE) { - // Optimization from BAP95: For short (leaves in paper, but just short - // here) total length, do a copy of data to a new leaf. - return concatenateBytes(left, right); - } - - if (left instanceof RopeByteString) { - final RopeByteString leftRope = (RopeByteString) left; - if (leftRope.right.size() + right.size() < CONCATENATE_BY_COPY_SIZE) { - // Optimization from BAP95: As an optimization of the case where the - // ByteString is constructed by repeated concatenate, recognize the case - // where a short string is concatenated to a left-hand node whose - // right-hand branch is short. In the paper this applies to leaves, but - // we just look at the length here. This has the advantage of shedding - // references to unneeded data when substrings have been taken. - // - // When we recognize this case, we do a copy of the data and create a - // new parent node so that the depth of the result is the same as the - // given left tree. - ByteString newRight = concatenateBytes(leftRope.right, right); - return new RopeByteString(leftRope.left, newRight); - } - - if (leftRope.left.getTreeDepth() > leftRope.right.getTreeDepth() - && leftRope.getTreeDepth() > right.getTreeDepth()) { - // Typically for concatenate-built strings the left-side is deeper than - // the right. This is our final attempt to concatenate without - // increasing the tree depth. We'll redo the node on the RHS. This - // is yet another optimization for building the string by repeatedly - // concatenating on the right. - ByteString newRight = new RopeByteString(leftRope.right, right); - return new RopeByteString(leftRope.left, newRight); - } - } - - // Fine, we'll add a node and increase the tree depth--unless we rebalance ;^) - int newDepth = Math.max(left.getTreeDepth(), right.getTreeDepth()) + 1; - if (newLength >= minLengthByDepth[newDepth]) { - // The tree is shallow enough, so don't rebalance - return new RopeByteString(left, right); - } - - return new Balancer().balance(left, right); - } - - /** - * Concatenates two strings by copying data values. This is called in a few - * cases in order to reduce the growth of the number of tree nodes. - * - * @param left string on the left - * @param right string on the right - * @return string formed by copying data bytes - */ - private static ByteString concatenateBytes(ByteString left, - ByteString right) { - int leftSize = left.size(); - int rightSize = right.size(); - byte[] bytes = new byte[leftSize + rightSize]; - left.copyTo(bytes, 0, 0, leftSize); - right.copyTo(bytes, 0, leftSize, rightSize); - return ByteString.wrap(bytes); // Constructor wraps bytes - } - - /** - * Create a new RopeByteString for testing only while bypassing all the - * defenses of {@link #concatenate(ByteString, ByteString)}. This allows - * testing trees of specific structure. We are also able to insert empty - * leaves, though these are dis-allowed, so that we can make sure the - * implementation can withstand their presence. - * - * @param left string on the left of this node - * @param right string on the right of this node - * @return an unsafe instance for testing only - */ - static RopeByteString newInstanceForTest(ByteString left, ByteString right) { - return new RopeByteString(left, right); - } - - /** - * Gets the byte at the given index. - * Throws {@link ArrayIndexOutOfBoundsException} for backwards-compatibility - * reasons although it would more properly be {@link - * IndexOutOfBoundsException}. - * - * @param index index of byte - * @return the value - * @throws ArrayIndexOutOfBoundsException {@code index} is < 0 or >= size - */ - @Override - public byte byteAt(int index) { - checkIndex(index, totalLength); - - // Find the relevant piece by recursive descent - if (index < leftLength) { - return left.byteAt(index); - } - - return right.byteAt(index - leftLength); - } - - @Override - public int size() { - return totalLength; - } - - // ================================================================= - // Pieces - - @Override - protected int getTreeDepth() { - return treeDepth; - } - - /** - * Determines if the tree is balanced according to BAP95, which means the tree - * is flat-enough with respect to the bounds. Note that this definition of - * balanced is one where sub-trees of balanced trees are not necessarily - * balanced. - * - * @return true if the tree is balanced - */ - @Override - protected boolean isBalanced() { - return totalLength >= minLengthByDepth[treeDepth]; - } - - /** - * Takes a substring of this one. This involves recursive descent along the - * left and right edges of the substring, and referencing any wholly contained - * segments in between. Any leaf nodes entirely uninvolved in the substring - * will not be referenced by the substring. - * - *

Substrings of {@code length < 2} should result in at most a single - * recursive call chain, terminating at a leaf node. Thus the result will be a - * {@link org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString.LeafByteString}. - * - * @param beginIndex start at this index - * @param endIndex the last character is the one before this index - * @return substring leaf node or tree - */ - @Override - public ByteString substring(int beginIndex, int endIndex) { - final int length = checkRange(beginIndex, endIndex, totalLength); - - if (length == 0) { - // Empty substring - return ByteString.EMPTY; - } - - if (length == totalLength) { - // The whole string - return this; - } - - // Proper substring - if (endIndex <= leftLength) { - // Substring on the left - return left.substring(beginIndex, endIndex); - } - - if (beginIndex >= leftLength) { - // Substring on the right - return right.substring(beginIndex - leftLength, endIndex - leftLength); - } - - // Split substring - ByteString leftSub = left.substring(beginIndex); - ByteString rightSub = right.substring(0, endIndex - leftLength); - // Intentionally not rebalancing, since in many cases these two - // substrings will already be less deep than the top-level - // RopeByteString we're taking a substring of. - return new RopeByteString(leftSub, rightSub); - } - - // ================================================================= - // ByteString -> byte[] - - @Override - protected void copyToInternal(byte[] target, int sourceOffset, - int targetOffset, int numberToCopy) { - if (sourceOffset + numberToCopy <= leftLength) { - left.copyToInternal(target, sourceOffset, targetOffset, numberToCopy); - } else if (sourceOffset >= leftLength) { - right.copyToInternal(target, sourceOffset - leftLength, targetOffset, - numberToCopy); - } else { - int leftLength = this.leftLength - sourceOffset; - left.copyToInternal(target, sourceOffset, targetOffset, leftLength); - right.copyToInternal(target, 0, targetOffset + leftLength, - numberToCopy - leftLength); - } - } - - @Override - public void copyTo(ByteBuffer target) { - left.copyTo(target); - right.copyTo(target); - } - - @Override - public ByteBuffer asReadOnlyByteBuffer() { - ByteBuffer byteBuffer = ByteBuffer.wrap(toByteArray()); - return byteBuffer.asReadOnlyBuffer(); - } - - @Override - public List asReadOnlyByteBufferList() { - // Walk through the list of LeafByteString's that make up this - // rope, and add each one as a read-only ByteBuffer. - List result = new ArrayList(); - PieceIterator pieces = new PieceIterator(this); - while (pieces.hasNext()) { - LeafByteString byteString = pieces.next(); - result.add(byteString.asReadOnlyByteBuffer()); - } - return result; - } - - @Override - public void writeTo(OutputStream outputStream) throws IOException { - left.writeTo(outputStream); - right.writeTo(outputStream); - } - - @Override - void writeToInternal(OutputStream out, int sourceOffset, - int numberToWrite) throws IOException { - if (sourceOffset + numberToWrite <= leftLength) { - left.writeToInternal(out, sourceOffset, numberToWrite); - } else if (sourceOffset >= leftLength) { - right.writeToInternal(out, sourceOffset - leftLength, numberToWrite); - } else { - int numberToWriteInLeft = leftLength - sourceOffset; - left.writeToInternal(out, sourceOffset, numberToWriteInLeft); - right.writeToInternal(out, 0, numberToWrite - numberToWriteInLeft); - } - } - - @Override - void writeTo(ByteOutput output) throws IOException { - left.writeTo(output); - right.writeTo(output); - } - - - @Override - protected String toStringInternal(Charset charset) { - return new String(toByteArray(), charset); - } - - // ================================================================= - // UTF-8 decoding - - @Override - public boolean isValidUtf8() { - int leftPartial = left.partialIsValidUtf8(Utf8.COMPLETE, 0, leftLength); - int state = right.partialIsValidUtf8(leftPartial, 0, right.size()); - return state == Utf8.COMPLETE; - } - - @Override - protected int partialIsValidUtf8(int state, int offset, int length) { - int toIndex = offset + length; - if (toIndex <= leftLength) { - return left.partialIsValidUtf8(state, offset, length); - } else if (offset >= leftLength) { - return right.partialIsValidUtf8(state, offset - leftLength, length); - } else { - int leftLength = this.leftLength - offset; - int leftPartial = left.partialIsValidUtf8(state, offset, leftLength); - return right.partialIsValidUtf8(leftPartial, 0, length - leftLength); - } - } - - // ================================================================= - // equals() and hashCode() - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - if (!(other instanceof ByteString)) { - return false; - } - - ByteString otherByteString = (ByteString) other; - if (totalLength != otherByteString.size()) { - return false; - } - if (totalLength == 0) { - return true; - } - - // You don't really want to be calling equals on long strings, but since - // we cache the hashCode, we effectively cache inequality. We use the cached - // hashCode if it's already computed. It's arguable we should compute the - // hashCode here, and if we're going to be testing a bunch of byteStrings, - // it might even make sense. - int thisHash = peekCachedHashCode(); - int thatHash = otherByteString.peekCachedHashCode(); - if (thisHash != 0 && thatHash != 0 && thisHash != thatHash) { - return false; - } - - return equalsFragments(otherByteString); - } - - /** - * Determines if this string is equal to another of the same length by - * iterating over the leaf nodes. On each step of the iteration, the - * overlapping segments of the leaves are compared. - * - * @param other string of the same length as this one - * @return true if the values of this string equals the value of the given - * one - */ - private boolean equalsFragments(ByteString other) { - int thisOffset = 0; - Iterator thisIter = new PieceIterator(this); - LeafByteString thisString = thisIter.next(); - - int thatOffset = 0; - Iterator thatIter = new PieceIterator(other); - LeafByteString thatString = thatIter.next(); - - int pos = 0; - while (true) { - int thisRemaining = thisString.size() - thisOffset; - int thatRemaining = thatString.size() - thatOffset; - int bytesToCompare = Math.min(thisRemaining, thatRemaining); - - // At least one of the offsets will be zero - boolean stillEqual = (thisOffset == 0) - ? thisString.equalsRange(thatString, thatOffset, bytesToCompare) - : thatString.equalsRange(thisString, thisOffset, bytesToCompare); - if (!stillEqual) { - return false; - } - - pos += bytesToCompare; - if (pos >= totalLength) { - if (pos == totalLength) { - return true; - } - throw new IllegalStateException(); - } - // We always get to the end of at least one of the pieces - if (bytesToCompare == thisRemaining) { // If reached end of this - thisOffset = 0; - thisString = thisIter.next(); - } else { - thisOffset += bytesToCompare; - } - if (bytesToCompare == thatRemaining) { // If reached end of that - thatOffset = 0; - thatString = thatIter.next(); - } else { - thatOffset += bytesToCompare; - } - } - } - - @Override - protected int partialHash(int h, int offset, int length) { - int toIndex = offset + length; - if (toIndex <= leftLength) { - return left.partialHash(h, offset, length); - } else if (offset >= leftLength) { - return right.partialHash(h, offset - leftLength, length); - } else { - int leftLength = this.leftLength - offset; - int leftPartial = left.partialHash(h, offset, leftLength); - return right.partialHash(leftPartial, 0, length - leftLength); - } - } - - // ================================================================= - // Input stream - - @Override - public CodedInputStream newCodedInput() { - return CodedInputStream.newInstance(new RopeInputStream()); - } - - @Override - public InputStream newInput() { - return new RopeInputStream(); - } - - /** - * This class implements the balancing algorithm of BAP95. In the paper the - * authors use an array to keep track of pieces, while here we use a stack. - * The tree is balanced by traversing subtrees in left to right order, and the - * stack always contains the part of the string we've traversed so far. - * - *

One surprising aspect of the algorithm is the result of balancing is not - * necessarily balanced, though it is nearly balanced. For details, see - * BAP95. - */ - private static class Balancer { - // Stack containing the part of the string, starting from the left, that - // we've already traversed. The final string should be the equivalent of - // concatenating the strings on the stack from bottom to top. - private final Stack prefixesStack = new Stack(); - - private ByteString balance(ByteString left, ByteString right) { - doBalance(left); - doBalance(right); - - // Sweep stack to gather the result - ByteString partialString = prefixesStack.pop(); - while (!prefixesStack.isEmpty()) { - ByteString newLeft = prefixesStack.pop(); - partialString = new RopeByteString(newLeft, partialString); - } - // We should end up with a RopeByteString since at a minimum we will - // create one from concatenating left and right - return partialString; - } - - private void doBalance(ByteString root) { - // BAP95: Insert balanced subtrees whole. This means the result might not - // be balanced, leading to repeated rebalancings on concatenate. However, - // these rebalancings are shallow due to ignoring balanced subtrees, and - // relatively few calls to insert() result. - if (root.isBalanced()) { - insert(root); - } else if (root instanceof RopeByteString) { - RopeByteString rbs = (RopeByteString) root; - doBalance(rbs.left); - doBalance(rbs.right); - } else { - throw new IllegalArgumentException( - "Has a new type of ByteString been created? Found " + - root.getClass()); - } - } - - /** - * Push a string on the balance stack (BAP95). BAP95 uses an array and - * calls the elements in the array 'bins'. We instead use a stack, so the - * 'bins' of lengths are represented by differences between the elements of - * minLengthByDepth. - * - *

If the length bin for our string, and all shorter length bins, are - * empty, we just push it on the stack. Otherwise, we need to start - * concatenating, putting the given string in the "middle" and continuing - * until we land in an empty length bin that matches the length of our - * concatenation. - * - * @param byteString string to place on the balance stack - */ - private void insert(ByteString byteString) { - int depthBin = getDepthBinForLength(byteString.size()); - int binEnd = minLengthByDepth[depthBin + 1]; - - // BAP95: Concatenate all trees occupying bins representing the length of - // our new piece or of shorter pieces, to the extent that is possible. - // The goal is to clear the bin which our piece belongs in, but that may - // not be entirely possible if there aren't enough longer bins occupied. - if (prefixesStack.isEmpty() || prefixesStack.peek().size() >= binEnd) { - prefixesStack.push(byteString); - } else { - int binStart = minLengthByDepth[depthBin]; - - // Concatenate the subtrees of shorter length - ByteString newTree = prefixesStack.pop(); - while (!prefixesStack.isEmpty() - && prefixesStack.peek().size() < binStart) { - ByteString left = prefixesStack.pop(); - newTree = new RopeByteString(left, newTree); - } - - // Concatenate the given string - newTree = new RopeByteString(newTree, byteString); - - // Continue concatenating until we land in an empty bin - while (!prefixesStack.isEmpty()) { - depthBin = getDepthBinForLength(newTree.size()); - binEnd = minLengthByDepth[depthBin + 1]; - if (prefixesStack.peek().size() < binEnd) { - ByteString left = prefixesStack.pop(); - newTree = new RopeByteString(left, newTree); - } else { - break; - } - } - prefixesStack.push(newTree); - } - } - - private int getDepthBinForLength(int length) { - int depth = Arrays.binarySearch(minLengthByDepth, length); - if (depth < 0) { - // It wasn't an exact match, so convert to the index of the containing - // fragment, which is one less even than the insertion point. - int insertionPoint = -(depth + 1); - depth = insertionPoint - 1; - } - - return depth; - } - } - - /** - * This class is a continuable tree traversal, which keeps the state - * information which would exist on the stack in a recursive traversal instead - * on a stack of "Bread Crumbs". The maximum depth of the stack in this - * iterator is the same as the depth of the tree being traversed. - * - *

This iterator is used to implement - * {@link RopeByteString#equalsFragments(ByteString)}. - */ - private static class PieceIterator implements Iterator { - - private final Stack breadCrumbs = - new Stack(); - private LeafByteString next; - - private PieceIterator(ByteString root) { - next = getLeafByLeft(root); - } - - private LeafByteString getLeafByLeft(ByteString root) { - ByteString pos = root; - while (pos instanceof RopeByteString) { - RopeByteString rbs = (RopeByteString) pos; - breadCrumbs.push(rbs); - pos = rbs.left; - } - return (LeafByteString) pos; - } - - private LeafByteString getNextNonEmptyLeaf() { - while (true) { - // Almost always, we go through this loop exactly once. However, if - // we discover an empty string in the rope, we toss it and try again. - if (breadCrumbs.isEmpty()) { - return null; - } else { - LeafByteString result = getLeafByLeft(breadCrumbs.pop().right); - if (!result.isEmpty()) { - return result; - } - } - } - } - - @Override - public boolean hasNext() { - return next != null; - } - - /** - * Returns the next item and advances one - * {@link org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString.LeafByteString}. - * - * @return next non-empty LeafByteString or {@code null} - */ - @Override - public LeafByteString next() { - if (next == null) { - throw new NoSuchElementException(); - } - LeafByteString result = next; - next = getNextNonEmptyLeaf(); - return result; - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - } - - // ================================================================= - // Serializable - - private static final long serialVersionUID = 1L; - - Object writeReplace() { - return ByteString.wrap(toByteArray()); - } - - private void readObject(@SuppressWarnings("unused") ObjectInputStream in) throws IOException { - throw new InvalidObjectException( - "RopeByteStream instances are not to be serialized directly"); - } - - /** - * This class is the {@link RopeByteString} equivalent for - * {@link ByteArrayInputStream}. - */ - private class RopeInputStream extends InputStream { - // Iterates through the pieces of the rope - private PieceIterator pieceIterator; - // The current piece - private LeafByteString currentPiece; - // The size of the current piece - private int currentPieceSize; - // The index of the next byte to read in the current piece - private int currentPieceIndex; - // The offset of the start of the current piece in the rope byte string - private int currentPieceOffsetInRope; - // Offset in the buffer at which user called mark(); - private int mark; - - public RopeInputStream() { - initialize(); - } - - @Override - public int read(byte b[], int offset, int length) { - if (b == null) { - throw new NullPointerException(); - } else if (offset < 0 || length < 0 || length > b.length - offset) { - throw new IndexOutOfBoundsException(); - } - return readSkipInternal(b, offset, length); - } - - @Override - public long skip(long length) { - if (length < 0) { - throw new IndexOutOfBoundsException(); - } else if (length > Integer.MAX_VALUE) { - length = Integer.MAX_VALUE; - } - return readSkipInternal(null, 0, (int) length); - } - - /** - * Internal implementation of read and skip. If b != null, then read the - * next {@code length} bytes into the buffer {@code b} at - * offset {@code offset}. If b == null, then skip the next {@code length} - * bytes. - *

- * This method assumes that all error checking has already happened. - *

- * Returns the actual number of bytes read or skipped. - */ - private int readSkipInternal(byte b[], int offset, int length) { - int bytesRemaining = length; - while (bytesRemaining > 0) { - advanceIfCurrentPieceFullyRead(); - if (currentPiece == null) { - if (bytesRemaining == length) { - // We didn't manage to read anything - return -1; - } - break; - } else { - // Copy the bytes from this piece. - int currentPieceRemaining = currentPieceSize - currentPieceIndex; - int count = Math.min(currentPieceRemaining, bytesRemaining); - if (b != null) { - currentPiece.copyTo(b, currentPieceIndex, offset, count); - offset += count; - } - currentPieceIndex += count; - bytesRemaining -= count; - } - } - // Return the number of bytes read. - return length - bytesRemaining; - } - - @Override - public int read() throws IOException { - advanceIfCurrentPieceFullyRead(); - if (currentPiece == null) { - return -1; - } else { - return currentPiece.byteAt(currentPieceIndex++) & 0xFF; - } - } - - @Override - public int available() throws IOException { - int bytesRead = currentPieceOffsetInRope + currentPieceIndex; - return RopeByteString.this.size() - bytesRead; - } - - @Override - public boolean markSupported() { - return true; - } - - @Override - public void mark(int readAheadLimit) { - // Set the mark to our position in the byte string - mark = currentPieceOffsetInRope + currentPieceIndex; - } - - @Override - public synchronized void reset() { - // Just reinitialize and skip the specified number of bytes. - initialize(); - readSkipInternal(null, 0, mark); - } - - /** Common initialization code used by both the constructor and reset() */ - private void initialize() { - pieceIterator = new PieceIterator(RopeByteString.this); - currentPiece = pieceIterator.next(); - currentPieceSize = currentPiece.size(); - currentPieceIndex = 0; - currentPieceOffsetInRope = 0; - } - - /** - * Skips to the next piece if we have read all the data in the current - * piece. Sets currentPiece to null if we have reached the end of the - * input. - */ - private void advanceIfCurrentPieceFullyRead() { - if (currentPiece != null && currentPieceIndex == currentPieceSize) { - // Generally, we can only go through this loop at most once, since - // empty strings can't end up in a rope. But better to test. - currentPieceOffsetInRope += currentPieceSize; - currentPieceIndex = 0; - if (pieceIterator.hasNext()) { - currentPiece = pieceIterator.next(); - currentPieceSize = currentPiece.size(); - } else { - currentPiece = null; - currentPieceSize = 0; - } - } - } - } -} http://git-wip-us.apache.org/repos/asf/hbase/blob/df93c13f/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcCallback.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcCallback.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcCallback.java deleted file mode 100644 index dc30060..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcCallback.java +++ /dev/null @@ -1,47 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -/** - * Interface for an RPC callback, normally called when an RPC completes. - * {@code ParameterType} is normally the method's response message type. - * - *

Starting with version 2.3.0, RPC implementations should not try to build - * on this, but should instead provide code generator plugins which generate - * code specific to the particular RPC implementation. This way the generated - * code can be more appropriate for the implementation in use and can avoid - * unnecessary layers of indirection. - * - * @author kenton@google.com Kenton Varda - */ -public interface RpcCallback { - void run(ParameterType parameter); -} http://git-wip-us.apache.org/repos/asf/hbase/blob/df93c13f/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcChannel.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcChannel.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcChannel.java deleted file mode 100644 index bf10784..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/RpcChannel.java +++ /dev/null @@ -1,71 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -/** - *

Abstract interface for an RPC channel. An {@code RpcChannel} represents a - * communication line to a {@link Service} which can be used to call that - * {@link Service}'s methods. The {@link Service} may be running on another - * machine. Normally, you should not call an {@code RpcChannel} directly, but - * instead construct a stub {@link Service} wrapping it. Example: - * - *

- *   RpcChannel channel = rpcImpl.newChannel("remotehost.example.com:1234");
- *   RpcController controller = rpcImpl.newController();
- *   MyService service = MyService.newStub(channel);
- *   service.myMethod(controller, request, callback);
- * 
- * - *

Starting with version 2.3.0, RPC implementations should not try to build - * on this, but should instead provide code generator plugins which generate - * code specific to the particular RPC implementation. This way the generated - * code can be more appropriate for the implementation in use and can avoid - * unnecessary layers of indirection. - * - * @author kenton@google.com Kenton Varda - */ -public interface RpcChannel { - /** - * Call the given method of the remote service. This method is similar to - * {@code Service.callMethod()} with one important difference: the caller - * decides the types of the {@code Message} objects, not the callee. The - * request may be of any type as long as - * {@code request.getDescriptor() == method.getInputType()}. - * The response passed to the callback will be of the same type as - * {@code responsePrototype} (which must have - * {@code getDescriptor() == method.getOutputType()}). - */ - void callMethod(Descriptors.MethodDescriptor method, - RpcController controller, - Message request, - Message responsePrototype, - RpcCallback done); -}