31 package com.google.protobuf;
39 final class ManifestSchemaFactory
implements SchemaFactory {
41 private final MessageInfoFactory messageInfoFactory;
43 public ManifestSchemaFactory() {
44 this(getDefaultMessageInfoFactory());
47 private ManifestSchemaFactory(MessageInfoFactory messageInfoFactory) {
48 this.messageInfoFactory = checkNotNull(messageInfoFactory,
"messageInfoFactory");
52 public <T> Schema<T> createSchema(Class<T> messageType) {
53 SchemaUtil.requireGeneratedMessage(messageType);
55 MessageInfo messageInfo = messageInfoFactory.messageInfoFor(messageType);
58 if (messageInfo.isMessageSetWireFormat()) {
59 if (GeneratedMessageLite.class.isAssignableFrom(messageType)) {
60 return MessageSetSchema.newSchema(
61 SchemaUtil.unknownFieldSetLiteSchema(),
62 ExtensionSchemas.lite(),
63 messageInfo.getDefaultInstance());
65 return MessageSetSchema.newSchema(
66 SchemaUtil.proto2UnknownFieldSetSchema(),
67 ExtensionSchemas.full(),
68 messageInfo.getDefaultInstance());
71 return newSchema(messageType, messageInfo);
74 private static <T> Schema<T> newSchema(Class<T> messageType, MessageInfo messageInfo) {
75 if (GeneratedMessageLite.class.isAssignableFrom(messageType)) {
76 return isProto2(messageInfo)
77 ? MessageSchema.newSchema(
80 NewInstanceSchemas.lite(),
81 ListFieldSchema.lite(),
82 SchemaUtil.unknownFieldSetLiteSchema(),
83 ExtensionSchemas.lite(),
84 MapFieldSchemas.lite())
85 : MessageSchema.newSchema(
88 NewInstanceSchemas.lite(),
89 ListFieldSchema.lite(),
90 SchemaUtil.unknownFieldSetLiteSchema(),
92 MapFieldSchemas.lite());
94 return isProto2(messageInfo)
95 ? MessageSchema.newSchema(
98 NewInstanceSchemas.full(),
99 ListFieldSchema.full(),
100 SchemaUtil.proto2UnknownFieldSetSchema(),
101 ExtensionSchemas.full(),
102 MapFieldSchemas.full())
103 : MessageSchema.newSchema(
106 NewInstanceSchemas.full(),
107 ListFieldSchema.full(),
108 SchemaUtil.proto3UnknownFieldSetSchema(),
110 MapFieldSchemas.full());
113 private static boolean isProto2(MessageInfo messageInfo) {
114 return messageInfo.getSyntax() == ProtoSyntax.PROTO2;
117 private static MessageInfoFactory getDefaultMessageInfoFactory() {
118 return new CompositeMessageInfoFactory(
119 GeneratedMessageInfoFactory.getInstance(), getDescriptorMessageInfoFactory());
131 for (MessageInfoFactory factory :
factories) {
132 if (factory.isSupported(clazz)) {
141 for (MessageInfoFactory factory :
factories) {
142 if (factory.isSupported(clazz)) {
143 return factory.messageInfoFor(clazz);
146 throw new UnsupportedOperationException(
147 "No factory is available for message type: " + clazz.getName());
151 private static final MessageInfoFactory EMPTY_FACTORY =
152 new MessageInfoFactory() {
154 public boolean isSupported(Class<?> clazz) {
159 public MessageInfo messageInfoFor(Class<?> clazz) {
160 throw new IllegalStateException(
"This should never be called.");
164 private static MessageInfoFactory getDescriptorMessageInfoFactory() {
166 Class<?> clazz = Class.forName(
"com.google.protobuf.DescriptorMessageInfoFactory");
167 return (MessageInfoFactory) clazz.getDeclaredMethod(
"getInstance").invoke(
null);
168 }
catch (Exception e) {
169 return EMPTY_FACTORY;