/*
* 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.TypeSystem;
import gw.util.concurrent.LockingLazyVar;
import gw.xml.XmlSimpleValue;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
public class HexBinarySimpleValueFactory extends XmlSimpleValueFactory {
private static final LockingLazyVar<IType> TYPE = new LockingLazyVar<IType>() {
@Override
protected IType init() {
return TypeSystem.get( byte[].class );
}
};
@Override
public IType getGosuValueType() {
return TYPE.get();
}
@Override
protected XmlSimpleValue _gosuValueToStorageValue( Object gosuValue ) {
return new Value( (byte[]) gosuValue );
}
@Override
protected XmlSimpleValue _deserialize( XmlDeserializationContext context, String stringValue, boolean isDefault ) {
return new Value( decode( stringValue ) );
}
public static String encode( byte[] bytes ) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
public static byte[] decode( String value ) {
value = value.replaceAll("\\s", "").trim();
if (value.length() % 2 != 0) {
throw new IllegalArgumentException("Expecting even number of hex digits in xsd:hexBinary");
}
byte[] b = new byte[value.length() / 2];
for (int i = 0; i < b.length; i++) {
String s = value.substring(i * 2, (i * 2) + 2);
b[i] = (byte) Integer.parseInt(s, 16);
}
return b;
}
private class Value extends XmlSimpleValueBase {
private byte[] _value;
public Value( byte[] value ) {
_value = value;
}
@Override
public IType getGosuValueType() {
return TYPE.get();
}
@Override
public Object _getGosuValue() {
return _value;
}
@Override
public String _getStringValue( boolean isEnumCode ) {
return encode( _value );
}
@Override
public String _serialize( XmlSerializationContext context ) {
return getStringValue();
}
@Override
public List<QName> _getQNames() {
return Collections.emptyList();
}
}
}