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.io.resource.convert; 019 020import com.google.common.net.MediaType; 021 022import dev.enola.common.io.resource.AbstractResource; 023import dev.enola.common.io.resource.ReadableResource; 024import dev.enola.common.io.resource.WritableResource; 025 026import java.io.IOException; 027import java.nio.charset.Charset; 028 029/** 030 * Copies all characters from the input into the output resource. 031 * 032 * <p>Depending on their respective {@link MediaType#charset()}, this may change the text encoding! 033 */ 034public class CharResourceConverter implements CatchingResourceConverter { 035 036 @Override 037 public boolean convertIntoThrows(ReadableResource from, WritableResource into) 038 throws IOException { 039 // TODO Test if this couldn't just be written as: (and delete private helpers) 040 // if (!from.mediaType().charset().equals(into.mediaType().charset()) { 041 if (hasCharset(from) && hasCharset(into) && !charset(from).equals(charset(into))) { 042 from.charSource().copyTo(into.charSink()); 043 return true; 044 } else { 045 return false; 046 } 047 } 048 049 private boolean hasCharset(AbstractResource resource) { 050 return resource.mediaType().charset().isPresent(); 051 } 052 053 private Charset charset(AbstractResource resource) { 054 return resource.mediaType().charset().get(); 055 } 056}