diff options
Diffstat (limited to 'java/src/main/java/com/google/protobuf/UninitializedMessageException.java')
-rw-r--r-- | java/src/main/java/com/google/protobuf/UninitializedMessageException.java | 85 |
1 files changed, 12 insertions, 73 deletions
diff --git a/java/src/main/java/com/google/protobuf/UninitializedMessageException.java b/java/src/main/java/com/google/protobuf/UninitializedMessageException.java index a1032caa..8743c120 100644 --- a/java/src/main/java/com/google/protobuf/UninitializedMessageException.java +++ b/java/src/main/java/com/google/protobuf/UninitializedMessageException.java @@ -30,12 +30,8 @@ package com.google.protobuf; -import com.google.protobuf.Descriptors.FieldDescriptor; - -import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; /** * Thrown when attempting to build a protocol message that is missing required @@ -51,11 +47,15 @@ import java.util.Map; * @author kenton@google.com Kenton Varda */ public class UninitializedMessageException extends RuntimeException { - public UninitializedMessageException(Message message) { - this(findMissingFields(message)); + private static final long serialVersionUID = -7466929953374883507L; + + public UninitializedMessageException(final MessageLite message) { + super("Message was missing required fields. (Lite runtime could not " + + "determine which fields were missing)."); + missingFields = null; } - private UninitializedMessageException(List<String> missingFields) { + public UninitializedMessageException(final List<String> missingFields) { super(buildDescription(missingFields)); this.missingFields = missingFields; } @@ -65,6 +65,8 @@ public class UninitializedMessageException extends RuntimeException { /** * Get a list of human-readable names of required fields missing from this * message. Each name is a full path to a field, e.g. "foo.bar[5].baz". + * Returns null if the lite runtime was used, since it lacks the ability to + * find missing fields. */ public List<String> getMissingFields() { return Collections.unmodifiableList(missingFields); @@ -80,11 +82,11 @@ public class UninitializedMessageException extends RuntimeException { } /** Construct the description string for this exception. */ - private static String buildDescription(List<String> missingFields) { - StringBuilder description = + private static String buildDescription(final List<String> missingFields) { + final StringBuilder description = new StringBuilder("Message missing required fields: "); boolean first = true; - for (String field : missingFields) { + for (final String field : missingFields) { if (first) { first = false; } else { @@ -94,67 +96,4 @@ public class UninitializedMessageException extends RuntimeException { } return description.toString(); } - - /** - * Populates {@code this.missingFields} with the full "path" of each - * missing required field in the given message. - */ - private static List<String> findMissingFields(Message message) { - List<String> results = new ArrayList<String>(); - findMissingFields(message, "", results); - return results; - } - - /** Recursive helper implementing {@link #findMissingFields(Message)}. */ - private static void findMissingFields(Message message, String prefix, - List<String> results) { - for (FieldDescriptor field : message.getDescriptorForType().getFields()) { - if (field.isRequired() && !message.hasField(field)) { - results.add(prefix + field.getName()); - } - } - - for (Map.Entry<FieldDescriptor, Object> entry : - message.getAllFields().entrySet()) { - FieldDescriptor field = entry.getKey(); - Object value = entry.getValue(); - - if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { - if (field.isRepeated()) { - int i = 0; - for (Object element : (List) value) { - findMissingFields((Message) element, - subMessagePrefix(prefix, field, i++), - results); - } - } else { - if (message.hasField(field)) { - findMissingFields((Message) value, - subMessagePrefix(prefix, field, -1), - results); - } - } - } - } - } - - private static String subMessagePrefix(String prefix, - FieldDescriptor field, - int index) { - StringBuilder result = new StringBuilder(prefix); - if (field.isExtension()) { - result.append('(') - .append(field.getFullName()) - .append(')'); - } else { - result.append(field.getName()); - } - if (index != -1) { - result.append('[') - .append(index) - .append(']'); - } - result.append('.'); - return result.toString(); - } } |