/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.xml.xsd.typeprovider.simplevaluefactory;
import gw.internal.xml.XmlDeserializationContext;
import gw.internal.xml.XmlSerializationContext;
import gw.internal.xml.XmlSimpleValueBase;
import gw.lang.reflect.IType;
import gw.lang.reflect.java.IJavaType;
import gw.lang.reflect.java.JavaTypes;
import gw.lang.reflect.java.JavaTypes;
import gw.xml.XmlSimpleValue;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
public class EncodedStringSimpleValueFactory extends XmlSimpleValueFactory {
@Override
public IType getGosuValueType() {
return JavaTypes.STRING();
}
@Override
protected XmlSimpleValue _gosuValueToStorageValue( Object gosuValue ) {
return new Value((String)gosuValue);
}
@Override
protected XmlSimpleValue _deserialize( XmlDeserializationContext context, String stringValue, boolean isDefault ) {
return new Value(decode(stringValue));
}
private String encode(String gosuValue) {
StringBuilder sb = new StringBuilder(gosuValue.length());
for (int i = 0; i != gosuValue.length(); i++) {
char c = gosuValue.charAt(i);
if (c < 0x20) {
switch (c) {
case 0x9: /* tab */
case 0xA: /* line feed */
case 0xD: /* cr */ sb.append(c); continue;
default: sb.append('^').append((char)('@' + c));
}
}
else if (c == '^') {
sb.append('^').append('|');
}
else if (c == 0xFFFE) {
sb.append('^').append('{');
}
else if (c == 0xFFFF) {
sb.append('^').append('}');
}
else {
sb.append(c);
}
}
return sb.toString();
}
private String decode(String stringValue) {
StringBuilder sb = new StringBuilder(stringValue.length());
for (int i = 0; i != stringValue.length(); i++) {
char c = stringValue.charAt(i);
if (c == '^') {
char cc = stringValue.charAt(++i);
switch (cc) {
case '|' : sb.append('^'); continue;
case '{' : sb.append((char)0xFFFE); continue;
case '}' : sb.append((char)0xFFFF); continue;
default:
char ch = (char)(cc - '@'); // would throw class cast exception
sb.append(ch);
}
}
else {
sb.append(c);
}
}
return sb.toString();
}
private class Value extends XmlSimpleValueBase {
private final String _value;
public Value( String value ) {
_value = value;
}
@Override
public IType getGosuValueType() {
return JavaTypes.STRING();
}
@Override
public Object _getGosuValue() {
return _value;
}
@Override
public String _getStringValue( boolean isEnumCode ) {
return encode(_value);
}
@Override
public String _serialize( XmlSerializationContext context ) {
return encode(_value);
}
@Override
public List<QName> _getQNames() {
return Collections.emptyList();
}
}
}