package com.netthreads.osc.common.domain; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * String cache to encode all strings into ByteBuffers. * */ public class OSCString { private static final Logger logger = LoggerFactory.getLogger(OSCString.class); private static final String CHAR_ENCODE = "US-ASCII"; public Charset charset = Charset.forName(CHAR_ENCODE); public CharsetEncoder encoder = charset.newEncoder(); private Map<String, byte[]> strings; private static OSCString instance = null; /** * Return singleton instance. * * @return the singleton instance. */ public static synchronized OSCString $() { if (instance == null) { instance = new OSCString(); } return instance; } public OSCString() { strings = new HashMap<String, byte[]>(); initialise(); } /** * Encode built in OSC strings. * */ private void initialise() { put(OSCDefinition.MESSAGE_BUNDLE_START, OSCDefinition.MESSAGE_BUNDLE_START); } /** * Put string into map. * * @param name * @param value */ public byte[] put(String name, String value) { byte[] buffer = null; try { buffer = encoder.encode(CharBuffer.wrap(value)).array(); strings.put(name, buffer); } catch (CharacterCodingException e) { logger.error(e.getLocalizedMessage(), e); } return buffer; } /** * Return associated byte buffer for name. Will buffer if it doesn't already exist in cache. * * @param name * * @return The buffer. */ public final byte[] get(String name) { byte[] target = strings.get(name); if (target == null) { target = put(name, name); } return target; } }