package org.aplikator.client.shared.rpc.marshaller; import java.io.Serializable; import org.aplikator.client.shared.data.ListItem; import org.aplikator.client.shared.rpc.marshaller.DataMarshallingUtils.DataType; import org.jboss.errai.marshalling.client.api.MarshallingSession; import org.jboss.errai.marshalling.client.api.annotations.ClientMarshaller; import org.jboss.errai.marshalling.client.api.annotations.ImplementationAliases; import org.jboss.errai.marshalling.client.api.annotations.ServerMarshaller; import org.jboss.errai.marshalling.client.api.json.EJObject; import org.jboss.errai.marshalling.client.api.json.EJValue; import org.jboss.errai.marshalling.client.marshallers.AbstractNullableMarshaller; @ClientMarshaller(ListItem.class) @ServerMarshaller(ListItem.class) @ImplementationAliases({ListItem.Default.class}) public class ListItemMarshaller extends AbstractNullableMarshaller<ListItem> { /*@Override public Class<ListItem> getTypeHandled() { return ListItem.class; }*/ @Override public ListItem[] getEmptyArray() { return new ListItem[0]; } @Override public ListItem doNotNullDemarshall(EJValue o, MarshallingSession ctx) { if (o.isObject() != null) { EJObject ejObject = o.isObject(); String name = ejObject.get("name").isString().stringValue(); if (ejObject.containsKey("value")) { DataType dt = DataMarshallingUtils.DataType.lookup(ejObject.get("value")); if (dt != null) { Serializable serialized = dt.demarshall(ejObject.get("value"), ctx); return new ListItem.Default(serialized, name); } else throw new UnsupportedOperationException("unsupported type '" + dt + "'"); } else throw new IllegalStateException("expected value key "); } else return null; } @Override public String doNotNullMarshall(ListItem o, MarshallingSession ctx) { StringBuilder builder = new StringBuilder().append('{'); DataType dt = DataMarshallingUtils.DataType.lookup(o.getValue()); if (dt != null) { MarshallingUtils.key("value", builder).append(':'); dt.marshall(builder, o.getValue(), ctx); } else { throw new UnsupportedOperationException("unsupported type '" + dt + "'"); } builder.append(','); MarshallingUtils.string("name", o.getName(), builder); builder.append('}'); return builder.toString(); } }