001 // Protocol Buffers - Google's data interchange format
002 // Copyright 2008 Google Inc.
003 // http://code.google.com/p/protobuf/
004 //
005 // Licensed under the Apache License, Version 2.0 (the "License");
006 // you may not use this file except in compliance with the License.
007 // You may obtain a copy of the License at
008 //
009 // http://www.apache.org/licenses/LICENSE-2.0
010 //
011 // Unless required by applicable law or agreed to in writing, software
012 // distributed under the License is distributed on an "AS IS" BASIS,
013 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 // See the License for the specific language governing permissions and
015 // limitations under the License.
016
017 package org.fusesource.hawtbuf.proto;
018
019 import java.util.Collections;
020 import java.util.List;
021
022 /**
023 * Thrown when attempting to build a protocol message that is missing required
024 * fields. This is a {@code RuntimeException} because it normally represents a
025 * programming error: it happens when some code which constructs a message fails
026 * to set all the fields. {@code parseFrom()} methods <b>do not</b> throw this;
027 * they throw an {@link InvalidProtocolBufferException} if required fields are
028 * missing, because it is not a programming error to receive an incomplete
029 * message. In other words, {@code UninitializedMessageException} should never
030 * be thrown by correct code, but {@code InvalidProtocolBufferException} might
031 * be.
032 *
033 * @author kenton@google.com Kenton Varda
034 */
035 public class UninitializedMessageException extends RuntimeException {
036
037 public UninitializedMessageException(List<String> missingFields) {
038 super(buildDescription(missingFields));
039 this.missingFields = missingFields;
040 }
041
042 private final List<String> missingFields;
043
044 /**
045 * Get a list of human-readable names of required fields missing from this
046 * message. Each name is a full path to a field, e.g. "foo.bar[5].baz".
047 */
048 public List<String> getMissingFields() {
049 return Collections.unmodifiableList(missingFields);
050 }
051
052 /**
053 * Converts this exception to an {@link InvalidProtocolBufferException}.
054 * When a parsed message is missing required fields, this should be thrown
055 * instead of {@code UninitializedMessageException}.
056 */
057 public InvalidProtocolBufferException asInvalidProtocolBufferException() {
058 return new InvalidProtocolBufferException(getMessage());
059 }
060
061 /** Construct the description string for this exception. */
062 private static String buildDescription(List<String> missingFields) {
063 StringBuilder description = new StringBuilder("Message missing required fields: ");
064 boolean first = true;
065 for (String field : missingFields) {
066 if (first) {
067 first = false;
068 } else {
069 description.append(", ");
070 }
071 description.append(field);
072 }
073 return description.toString();
074 }
075
076 }