/* * Copyright 2005-2015 by BerryWorks Software, LLC. All rights reserved. * * This file is part of EDIReader. You may obtain a license for its use directly from * BerryWorks Software, and you may also choose to use this software under the terms of the * GPL version 3. Other products in the EDIReader software suite are available only by licensing * with BerryWorks. Only those files bearing the GPL statement below are available under the GPL. * * EDIReader is free software: you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * EDIReader is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with EDIReader. If not, * see <http://www.gnu.org/licenses/>. */ package com.berryworks.edireader.util.base64; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharsetEncoder; import java.nio.charset.CoderResult; /** * Provides for base-64 decoding of Java Strings. */ public class StringBase64Decoder extends AbstractDecoder { private final StringBuilder stringBuffer = new StringBuilder(); private final ByteBuffer byteBuffer = ByteBuffer.allocate(100); @Override protected void emit(byte b) { if (!byteBuffer.hasRemaining()) { feedStringBuffer(); byteBuffer.clear(); } byteBuffer.put(b); } private void feedStringBuffer() { byteBuffer.flip(); stringBuffer.append(charset.decode(byteBuffer)); } /** * Decodes the characters in a base-64 encoded String, producing the * original data as a String. * * @param encodedText - the base-64 encoded text that is to be decoded * @return decoded text */ public String decodeAsString(String encodedText) { CharBuffer charBuffer = CharBuffer.wrap(encodedText); // Allocate a modest sized non-direct ByteBuffer to receive the // bytes as they are encoded from the String ByteBuffer base64ByteBuffer = ByteBuffer.allocate(100); // Use the encoder repeatedly until all of the chars have been encoded as bytes // and presented as input for base 64 encoding. CharsetEncoder encoder = charset.newEncoder(); while (true) { CoderResult coderResult = encoder.encode(charBuffer, base64ByteBuffer, true); if (coderResult.isError()) throw new RuntimeException("Unrecoverable failure in Base64 encoding"); base64ByteBuffer.flip(); while (base64ByteBuffer.hasRemaining()) consume(base64ByteBuffer.get()); if (coderResult.isUnderflow()) break; base64ByteBuffer.clear(); } endOfData(); feedStringBuffer(); return stringBuffer.toString(); } }