aboutsummaryrefslogtreecommitdiffhomepage
path: root/java/src/main/java/com/google/protobuf/UninitializedMessageException.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/main/java/com/google/protobuf/UninitializedMessageException.java')
-rw-r--r--java/src/main/java/com/google/protobuf/UninitializedMessageException.java85
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();
- }
}