/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.utils.common; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Arrays; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; /** * Similar to FileEncodingUtils, only for IFiles. * * @author Arne Bachmann */ public final class ProjectFileEncodingUtils { /** * The buffer size. */ private static final int BUF_SIZE = 1024 * 8; /** * Utility class. */ private ProjectFileEncodingUtils() { // hiding constructor } /** * Decode the given byte sequence into a Java string. * @param data The data to decode * @param encoding The encoding * @return The resulting Java string */ public static String decodeString(final byte[] data, final String encoding) { return Charset.forName(encoding).decode(ByteBuffer.wrap(data)).toString(); } /** * Helper to read a ifile from the workspace into a string. * * @param ifile The ifile object * @param encoding The file's encoding to decode from * @return The file's contents * @throws CoreException A * @throws IOException B */ public static String loadIfileAsString(final IFile ifile, final String encoding) throws CoreException, IOException { final byte[] bytes = loadIfileAsBytes(ifile); return decodeString(bytes, encoding); } /** * Helper to read a ifile from the workspace into a byte array. * * @param ifile The ifile object * @return The file's contents * @throws CoreException A * @throws IOException B */ public static byte[] loadIfileAsBytes(final IFile ifile) throws CoreException, IOException { final InputStream is = ifile.getContents(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final byte[] buffer = new byte[BUF_SIZE]; int num; while ((num = is.read(buffer)) > 0) { baos.write(buffer, 0, num); } is.close(); baos.close(); // effect-less return baos.toByteArray(); } /** * Encode a Java string to byte array. * @param string The string to encode * @param encoding The encoding to produce * @return The resulting byte sequence */ public static byte[] encodeString(final String string, final String encoding) { final ByteBuffer bb = Charset.forName(encoding).encode(string); final byte[] buffer = bb.array(); return Arrays.copyOfRange(buffer, 0, bb.limit()); } /** * Helper to write an ifile to the workspace from a string. * * @param file The ifile object to write to * @param string The contents to write * @param encoding If set, (un)convert to this * @throws CoreException A * RuntimeException if no UTF-8 available */ public static void saveStringAsIfile(final IFile file, final String string, final String encoding) throws CoreException { saveBytesAsIfile(file, encodeString(string, encoding)); } /** * Helper to write an ifile to the workspace from a string. * * @param file The ifile object to write to * @param bytes The contents to write * @throws CoreException A */ public static void saveBytesAsIfile(final IFile file, final byte[] bytes) throws CoreException { file.setContents(new ByteArrayInputStream(bytes), /* force if not in sync */ true, /* keep history */ false, /* progress monitor */ null); } }