|
@@ -73,6 +73,36 @@ public abstract class GeneratedMessage extends AbstractMessage {
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
+ public boolean isInitialized() {
|
|
|
+ // Check that all required fields are present.
|
|
|
+ for (FieldDescriptor field : getDescriptorForType().getFields()) {
|
|
|
+ if (field.isRequired()) {
|
|
|
+ if (!hasField(field)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check that embedded messages are initialized.
|
|
|
+ for (FieldDescriptor field : getDescriptorForType().getFields()) {
|
|
|
+ if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
|
|
|
+ if (field.isRepeated()) {
|
|
|
+ for (Message element : (List<Message>) getField(field)) {
|
|
|
+ if (!element.isInitialized()) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!((Message) getField(field)).isInitialized()) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
public Map<FieldDescriptor, Object> getAllFields() {
|
|
|
return Collections.unmodifiableMap(getAllFieldsMutable());
|
|
@@ -356,6 +386,10 @@ public abstract class GeneratedMessage extends AbstractMessage {
|
|
|
protected boolean extensionsAreInitialized() {
|
|
|
return extensions.isInitialized();
|
|
|
}
|
|
|
+
|
|
|
+ public boolean isInitialized() {
|
|
|
+ return super.isInitialized() && extensionsAreInitialized();
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* Used by subclasses to serialize extensions. Extension ranges may be
|