001/* 002 * SPDX-License-Identifier: Apache-2.0 003 * 004 * Copyright 2024-2026 The Enola <https://enola.dev> Authors 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package dev.enola.common.protobuf; 019 020import com.google.protobuf.Descriptors; 021import com.google.protobuf.Descriptors.Descriptor; 022import com.google.protobuf.DynamicMessage; 023 024import dev.enola.common.io.resource.ReadableResource; 025import dev.enola.common.io.resource.WritableResource; 026import dev.enola.common.io.resource.convert.CatchingResourceConverter; 027 028import java.io.IOException; 029 030/** Converts Resources containing Protocol Buffer messages using the {@link ProtoIO} utility. */ 031public class MessageResourceConverter implements CatchingResourceConverter { 032 033 private final DescriptorProvider descriptorProvider; 034 private final ProtoIO protoIO; 035 036 public MessageResourceConverter(ProtoIO protoIO, DescriptorProvider descriptorProvider) { 037 this.descriptorProvider = descriptorProvider; 038 this.protoIO = protoIO; 039 } 040 041 @Override 042 public boolean convertIntoThrows(ReadableResource from, WritableResource into) 043 throws IOException { 044 var fromProtoFQN = ProtobufMediaTypes.getProtoMessageFQN(from.mediaType()); 045 if (fromProtoFQN.isPresent()) { 046 Descriptors.Descriptor descriptor = 047 (Descriptor) descriptorProvider.findByName(fromProtoFQN.get()); 048 // TODO Use new Messages (EnolaMessages) utility here #performance 049 var builder = DynamicMessage.newBuilder(descriptor); 050 protoIO.convert(from, builder, into); 051 return true; 052 } else { 053 return false; 054 } 055 } 056}