package io.fathom.cloud.protobuf; import java.lang.reflect.Method; import java.util.Map; import com.google.common.collect.Maps; import com.google.protobuf.Message; import com.google.protobuf.Message.Builder; public class ProtobufUtils { static final Map<Class<?>, Builder> builders = Maps.newHashMap(); public static Builder newBuilder(Class<?> type) { Builder builder = builders.get(type); if (builder == null) { try { Class<?> messageClass; if (Message.Builder.class.isAssignableFrom(type)) { messageClass = type.getEnclosingClass(); builder = newBuilder(messageClass); } else if (Message.class.isAssignableFrom(type)) { Method method = type.getMethod("newBuilder"); builder = (Builder) method.invoke(null); } else { throw new UnsupportedOperationException(); } builders.put(type, builder); } catch (ReflectiveOperationException e) { throw new IllegalStateException("Error building instance", e); } } return builder.clone(); } }