aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/protobuf/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/protobuf/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java')
-rw-r--r--third_party/protobuf/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java342
1 files changed, 0 insertions, 342 deletions
diff --git a/third_party/protobuf/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java b/third_party/protobuf/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
deleted file mode 100644
index 21d11b2ce7..0000000000
--- a/third_party/protobuf/java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java
+++ /dev/null
@@ -1,342 +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 com.google.protobuf.util;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.common.base.CaseFormat;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.primitives.Ints;
-import com.google.protobuf.Descriptors.Descriptor;
-import com.google.protobuf.Descriptors.FieldDescriptor;
-import com.google.protobuf.FieldMask;
-import com.google.protobuf.Internal;
-import com.google.protobuf.Message;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Utility helper functions to work with {@link com.google.protobuf.FieldMask}.
- */
-public class FieldMaskUtil {
- private static final String FIELD_PATH_SEPARATOR = ",";
- private static final String FIELD_PATH_SEPARATOR_REGEX = ",";
- private static final String FIELD_SEPARATOR_REGEX = "\\.";
-
- private FieldMaskUtil() {}
-
- /**
- * Converts a FieldMask to a string.
- */
- public static String toString(FieldMask fieldMask) {
- // TODO(xiaofeng): Consider using com.google.common.base.Joiner here instead.
- StringBuilder result = new StringBuilder();
- boolean first = true;
- for (String value : fieldMask.getPathsList()) {
- if (value.isEmpty()) {
- // Ignore empty paths.
- continue;
- }
- if (first) {
- first = false;
- } else {
- result.append(FIELD_PATH_SEPARATOR);
- }
- result.append(value);
- }
- return result.toString();
- }
-
- /**
- * Parses from a string to a FieldMask.
- */
- public static FieldMask fromString(String value) {
- // TODO(xiaofeng): Consider using com.google.common.base.Splitter here instead.
- return fromStringList(null, Arrays.asList(value.split(FIELD_PATH_SEPARATOR_REGEX)));
- }
-
- /**
- * Parses from a string to a FieldMask and validates all field paths.
- *
- * @throws IllegalArgumentException if any of the field path is invalid.
- */
- public static FieldMask fromString(Class<? extends Message> type, String value) {
- // TODO(xiaofeng): Consider using com.google.common.base.Splitter here instead.
- return fromStringList(type, Arrays.asList(value.split(FIELD_PATH_SEPARATOR_REGEX)));
- }
-
- /**
- * Constructs a FieldMask for a list of field paths in a certain type.
- *
- * @throws IllegalArgumentException if any of the field path is not valid.
- */
- // TODO(xiaofeng): Consider renaming fromStrings()
- public static FieldMask fromStringList(Class<? extends Message> type, Iterable<String> paths) {
- FieldMask.Builder builder = FieldMask.newBuilder();
- for (String path : paths) {
- if (path.isEmpty()) {
- // Ignore empty field paths.
- continue;
- }
- if (type != null && !isValid(type, path)) {
- throw new IllegalArgumentException(path + " is not a valid path for " + type);
- }
- builder.addPaths(path);
- }
- return builder.build();
- }
-
- /**
- * Constructs a FieldMask from the passed field numbers.
- *
- * @throws IllegalArgumentException if any of the fields are invalid for the message.
- */
- public static FieldMask fromFieldNumbers(Class<? extends Message> type, int... fieldNumbers) {
- return fromFieldNumbers(type, Ints.asList(fieldNumbers));
- }
-
- /**
- * Constructs a FieldMask from the passed field numbers.
- *
- * @throws IllegalArgumentException if any of the fields are invalid for the message.
- */
- public static FieldMask fromFieldNumbers(
- Class<? extends Message> type, Iterable<Integer> fieldNumbers) {
- Descriptor descriptor = Internal.getDefaultInstance(type).getDescriptorForType();
-
- FieldMask.Builder builder = FieldMask.newBuilder();
- for (Integer fieldNumber : fieldNumbers) {
- FieldDescriptor field = descriptor.findFieldByNumber(fieldNumber);
- checkArgument(
- field != null,
- String.format("%s is not a valid field number for %s.", fieldNumber, type));
- builder.addPaths(field.getName());
- }
- return builder.build();
- }
-
- /**
- * Converts a field mask to a Proto3 JSON string, that is converting from snake case to camel
- * case and joining all paths into one string with commas.
- */
- public static String toJsonString(FieldMask fieldMask) {
- List<String> paths = new ArrayList<String>(fieldMask.getPathsCount());
- for (String path : fieldMask.getPathsList()) {
- if (path.isEmpty()) {
- continue;
- }
- paths.add(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, path));
- }
- return Joiner.on(FIELD_PATH_SEPARATOR).join(paths);
- }
-
- /**
- * Converts a field mask from a Proto3 JSON string, that is splitting the paths along commas and
- * converting from camel case to snake case.
- */
- public static FieldMask fromJsonString(String value) {
- Iterable<String> paths = Splitter.on(FIELD_PATH_SEPARATOR).split(value);
- FieldMask.Builder builder = FieldMask.newBuilder();
- for (String path : paths) {
- if (path.isEmpty()) {
- continue;
- }
- builder.addPaths(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, path));
- }
- return builder.build();
- }
-
- /**
- * Checks whether paths in a given fields mask are valid.
- */
- public static boolean isValid(Class<? extends Message> type, FieldMask fieldMask) {
- Descriptor descriptor = Internal.getDefaultInstance(type).getDescriptorForType();
-
- return isValid(descriptor, fieldMask);
- }
-
- /**
- * Checks whether paths in a given fields mask are valid.
- */
- public static boolean isValid(Descriptor descriptor, FieldMask fieldMask) {
- for (String path : fieldMask.getPathsList()) {
- if (!isValid(descriptor, path)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Checks whether a given field path is valid.
- */
- public static boolean isValid(Class<? extends Message> type, String path) {
- Descriptor descriptor = Internal.getDefaultInstance(type).getDescriptorForType();
-
- return isValid(descriptor, path);
- }
-
- /**
- * Checks whether paths in a given fields mask are valid.
- */
- public static boolean isValid(Descriptor descriptor, String path) {
- String[] parts = path.split(FIELD_SEPARATOR_REGEX);
- if (parts.length == 0) {
- return false;
- }
- for (String name : parts) {
- if (descriptor == null) {
- return false;
- }
- FieldDescriptor field = descriptor.findFieldByName(name);
- if (field == null) {
- return false;
- }
- if (!field.isRepeated() && field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
- descriptor = field.getMessageType();
- } else {
- descriptor = null;
- }
- }
- return true;
- }
-
- /**
- * Converts a FieldMask to its canonical form. In the canonical form of a
- * FieldMask, all field paths are sorted alphabetically and redundant field
- * paths are moved.
- */
- public static FieldMask normalize(FieldMask mask) {
- return new FieldMaskTree(mask).toFieldMask();
- }
-
- /**
- * Creates a union of two or more FieldMasks.
- */
- public static FieldMask union(
- FieldMask firstMask, FieldMask secondMask, FieldMask... otherMasks) {
- FieldMaskTree maskTree = new FieldMaskTree(firstMask).mergeFromFieldMask(secondMask);
- for (FieldMask mask : otherMasks) {
- maskTree.mergeFromFieldMask(mask);
- }
- return maskTree.toFieldMask();
- }
-
- /**
- * Calculates the intersection of two FieldMasks.
- */
- public static FieldMask intersection(FieldMask mask1, FieldMask mask2) {
- FieldMaskTree tree = new FieldMaskTree(mask1);
- FieldMaskTree result = new FieldMaskTree();
- for (String path : mask2.getPathsList()) {
- tree.intersectFieldPath(path, result);
- }
- return result.toFieldMask();
- }
-
- /**
- * Options to customize merging behavior.
- */
- public static final class MergeOptions {
- private boolean replaceMessageFields = false;
- private boolean replaceRepeatedFields = false;
- // TODO(b/28277137): change the default behavior to always replace primitive fields after
- // fixing all failing TAP tests.
- private boolean replacePrimitiveFields = false;
-
- /**
- * Whether to replace message fields (i.e., discard existing content in
- * destination message fields) when merging.
- * Default behavior is to merge the source message field into the
- * destination message field.
- */
- public boolean replaceMessageFields() {
- return replaceMessageFields;
- }
-
- /**
- * Whether to replace repeated fields (i.e., discard existing content in
- * destination repeated fields) when merging.
- * Default behavior is to append elements from source repeated field to the
- * destination repeated field.
- */
- public boolean replaceRepeatedFields() {
- return replaceRepeatedFields;
- }
-
- /**
- * Whether to replace primitive (non-repeated and non-message) fields in
- * destination message fields with the source primitive fields (i.e., if the
- * field is set in the source, the value is copied to the
- * destination; if the field is unset in the source, the field is cleared
- * from the destination) when merging.
- *
- * <p>Default behavior is to always set the value of the source primitive
- * field to the destination primitive field, and if the source field is
- * unset, the default value of the source field is copied to the
- * destination.
- */
- public boolean replacePrimitiveFields() {
- return replacePrimitiveFields;
- }
-
- public void setReplaceMessageFields(boolean value) {
- replaceMessageFields = value;
- }
-
- public void setReplaceRepeatedFields(boolean value) {
- replaceRepeatedFields = value;
- }
-
- public void setReplacePrimitiveFields(boolean value) {
- replacePrimitiveFields = value;
- }
- }
-
- /**
- * Merges fields specified by a FieldMask from one message to another with the
- * specified merge options.
- */
- public static void merge(
- FieldMask mask, Message source, Message.Builder destination, MergeOptions options) {
- new FieldMaskTree(mask).merge(source, destination, options);
- }
-
- /**
- * Merges fields specified by a FieldMask from one message to another.
- */
- public static void merge(FieldMask mask, Message source, Message.Builder destination) {
- merge(mask, source, destination, new MergeOptions());
- }
-}