/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.commons.utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
/**
* An implementation of a char encoder that is stateless and is based on a specified charset.
*
* @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a>
* @version $Revision$
*/
public class CharsetCharEncoder implements CharEncoder {
private static final CharEncoder UTF8 = new CharsetCharEncoder(Charset.forName("UTF8"));
private static final byte[] EMPTY = new byte[0];
public static CharEncoder getUTF8() {
return UTF8;
}
private final Charset charset;
private final java.nio.CharBuffer in;
private final ByteBuffer out;
private final byte[][] arrays;
public CharsetCharEncoder(Charset charset) {
this.charset = charset;
this.in = CharBuffer.allocate(1);
this.out = ByteBuffer.allocate(100);
this.arrays = new byte[][] { new byte[0], new byte[1], new byte[2], new byte[3], new byte[4], new byte[5] };
}
public Charset getCharset() {
return charset;
}
public byte[] encode(char c) {
/*
* switch (Character.getType(c)) { case Character.SURROGATE: case Character.PRIVATE_USE: return EMPTY; default: if
* (encoder.canEncode(c)) { in.rewind(); out.rewind(); in.put(0, c); encoder.reset(); encoder.encode(in, out, true);
* encoder.flush(out); int length = out.position(); byte[] bytes = arrays[length]; System.arraycopy(out.array(), 0,
* bytes, 0, length); return bytes; } else { return EMPTY; } }
*/
try {
CharsetEncoder encoder = charset.newEncoder();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(baos, encoder);
writer.write(c);
writer.close();
return baos.toByteArray();
} catch (IOException e) {
throw new AssertionError(e);
}
}
}