/* * Created on Dec 31, 2004 at the Interface Ecology Lab. */ package ecologylab.serialization.types.scalar; import java.io.IOException; import org.json.simple.JSONObject; import ecologylab.serialization.ScalarUnmarshallingContext; import ecologylab.serialization.TranslationContext; import ecologylab.serialization.XMLTools; import ecologylab.serialization.annotations.simpl_inherit; import ecologylab.serialization.formatenums.Format; import ecologylab.serialization.types.CrossLanguageTypeConstants; /** * Type system entry for {@link java.lang.String String}. A very simple case. * * @author andruid */ @simpl_inherit public class StringType extends ReferenceType<String> implements CrossLanguageTypeConstants { /** * This constructor should only be called once per session, through a static initializer, * typically in TypeRegistry. * <p> * To get the instance of this type object for use in translations, call * <code>TypeRegistry.get("java.lang.String")</code>. * */ public StringType() { super(String.class, JAVA_STRING, DOTNET_STRING, OBJC_STRING, null); } /** * Just return the value itself. A transparent pass-through. * * @see ecologylab.serialization.types.ScalarType#getInstance(java.lang.String, String[], * ScalarUnmarshallingContext) */ @Override public String getInstance(String value, String[] formatStrings, ScalarUnmarshallingContext scalarUnmarshallingContext) { return value; } /** * Get a String representation of the instance, which is simply this. * * @param instance * @return */ @Override public String marshall(String instance, TranslationContext serializationContext) { return instance; } /** * Append the String directly, unless it needs escaping, in which case, call escapeXML. * * @param instance * @param buffy * @param needsEscaping */ @Override public void appendValue(String instance, StringBuilder buffy, boolean needsEscaping, TranslationContext serializationContext) { if (needsEscaping) XMLTools.escapeXML(buffy, instance); else buffy.append(instance); } /** * Append the String directly, unless it needs escaping, in which case, call escapeXML. * * @param instance * @param appendable * @param needsEscaping * @throws IOException */ @Override public void appendValue(String instance, Appendable appendable, boolean needsEscaping, TranslationContext serializationContext, Format format) throws IOException { if (needsEscaping) { switch (format) { case JSON: appendable.append(JSONObject.escape(instance)); break; case XML: XMLTools.escapeXML(appendable, instance); break; default: XMLTools.escapeXML(appendable, instance); break; } } else appendable.append(instance); } /** * When editing, determines whether delimiters can be included in token strings. * * @return */ // FIXME -- Add String delimitersAfter to TextChunk -- interleaved with TextTokens, and // get rid of this!!! @Override public boolean allowDelimitersInTokens() { return true; } }