package org.aplikator.client.shared.rpc.marshaller;
import java.util.ArrayList;
import java.util.List;
import org.aplikator.client.shared.descriptor.*;
import org.jboss.errai.marshalling.client.api.Marshaller;
import org.jboss.errai.marshalling.client.api.MarshallingSession;
import org.jboss.errai.marshalling.client.api.json.EJArray;
import org.jboss.errai.marshalling.client.api.json.EJObject;
import org.jboss.errai.marshalling.client.api.json.EJString;
import org.jboss.errai.marshalling.client.api.json.EJValue;
public class WidgetMarshallingUtils {
private static final String TYPE = "type";
public static enum WidgetType {
panel {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
PanelDTO p = (PanelDTO) val;
input.append('{');
defaultProps(input, val, this);
input.append(',');
MarshallingUtils.bool("frame", p.isFrame(), input).append(',');
MarshallingUtils.bool("horizontal", p.isHorizontal(), input).append(',');
children(input, (PanelDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
PanelDTO panel = new PanelDTO();
EJObject ejObject = ejval.isObject();
defaultProps(ejObject, panel);
children(ejObject, panel, ctx);
if (ejObject.containsKey("frame")) {
panel.setFrame(ejObject.get("frame").isBoolean().booleanValue());
}
if (ejObject.containsKey("horizontal")) {
panel.setHorizontal(ejObject.get("horizontal").isBoolean().booleanValue());
}
return panel;
} else
return null;
}
@Override
public Class handleType() {
return PanelDTO.class;
}
@Override
public String typeName() {
return "panel";
}
},
combo {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (ComboBoxDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
ComboBoxDTO cb = new ComboBoxDTO();
defaultProps(ejval.isObject(), cb);
property(cb, ejval.isObject(), ctx);
return cb;
} else
return null;
}
@Override
public Class handleType() {
return ComboBoxDTO.class;
}
@Override
public String typeName() {
return "combo";
}
},
simplelabel {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (SimpleLabelDTO) val, ctx);
input.append(',');
MarshallingUtils.string("labelType", ((SimpleLabelDTO) val).getLabelType(), input);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
SimpleLabelDTO lb = new SimpleLabelDTO();
defaultProps(ejval.isObject(), lb);
property(lb, ejval.isObject(), ctx);
if (DemarshallingUtils.containsAndNotNull(ejval.isObject(), "labelType")) {
lb.setLabelType(ejval.isObject().get("labelType").isString().stringValue());
}
return lb;
} else
return null;
}
@Override
public Class handleType() {
return SimpleLabelDTO.class;
}
@Override
public String typeName() {
return "simplelabel";
}
},
simplebadge {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (SimpleBadgeDTO) val, ctx);
input.append(',');
MarshallingUtils.string("badgeType", ((SimpleBadgeDTO) val).getBadgeType(), input);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
SimpleBadgeDTO lb = new SimpleBadgeDTO();
defaultProps(ejval.isObject(), lb);
property(lb, ejval.isObject(), ctx);
if (DemarshallingUtils.containsAndNotNull(ejval.isObject(), "badgeType")) {
lb.setBadgeType(ejval.isObject().get("badgeType").isString().stringValue());
}
return lb;
} else
return null;
}
@Override
public Class handleType() {
return SimpleBadgeDTO.class;
}
@Override
public String typeName() {
return "simplebadge";
}
},
label {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (LabelFieldDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
LabelFieldDTO lb = new LabelFieldDTO();
defaultProps(ejval.isObject(), lb);
property(lb, ejval.isObject(), ctx);
return lb;
} else
return null;
}
@Override
public Class handleType() {
return LabelFieldDTO.class;
}
@Override
public String typeName() {
return "label";
}
},
reference {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
ReferenceFieldDTO ref = (ReferenceFieldDTO) val;
defaultProps(input, val, this);
input.append(',');
MarshallingUtils.key("child", input).append(':');
lookup(((ReferenceFieldDTO) val).getChild()).marshall(input, ref.getChild(), ctx).append(',');
MarshallingUtils.key("view", input).append(':');
Marshaller<Object> marsh = ctx.getMarshallerInstance(ViewDTO.class.getName());
input.append(marsh.marshall(ref.getView(), ctx));
input.append(',');
property(input, (ReferenceFieldDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
EJObject ejObject = ejval.isObject();
ReferenceFieldDTO ref = new ReferenceFieldDTO();
defaultProps(ejval.isObject(), ref);
if (ejObject.containsKey("child")) {
WidgetDTO child = lookup(ejObject.get("child")).demarshall(ejObject.get("child"), ctx);
ref.setChild(child);
}
if (ejObject.containsKey("view")) {
Marshaller<Object> marsh = ctx.getMarshallerInstance(ViewDTO.class.getName());
Object view = marsh.demarshall(ejObject.get("view"), ctx);
ref.setView((ViewDTO) view);
}
property(ref, ejval.isObject(), ctx);
return ref;
} else
return null;
}
@Override
public Class handleType() {
return ReferenceFieldDTO.class;
}
@Override
public String typeName() {
return "reference";
}
},
checkbox {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (CheckBoxDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
CheckBoxDTO bf = new CheckBoxDTO();
defaultProps(ejval.isObject(), bf);
property(bf, ejval.isObject(), ctx);
return bf;
} else
return null;
}
@Override
public Class handleType() {
return CheckBoxDTO.class;
}
@Override
public String typeName() {
return "checkbox";
}
},
radiobutton {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (RadioButtonDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
RadioButtonDTO bf = new RadioButtonDTO();
defaultProps(ejval.isObject(), bf);
property(bf, ejval.isObject(), ctx);
return bf;
} else
return null;
}
@Override
public Class handleType() {
return RadioButtonDTO.class;
}
@Override
public String typeName() {
return "radio";
}
},
pageheader {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val,
MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (PageHeaderDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
PageHeaderDTO ph = new PageHeaderDTO();
defaultProps(ejval.isObject(), ph);
property(ph, ejval.isObject(), ctx);
return ph;
} else
return null;
}
@Override
public Class handleType() {
return PageHeaderDTO.class;
}
@Override
public String typeName() {
return "pageheader";
}
},
binary {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
BinaryFieldDTO bf = (BinaryFieldDTO) val;
input.append('{');
defaultProps(input, val, this);
input.append(',');
MarshallingUtils.string("entityId", bf.getEntityId(), input);
input.append(',');
MarshallingUtils.number("height", bf.getHeight(), input);
input.append(',');
MarshallingUtils.bool("useThumbnail", bf.isUseThumbnail(), input);
input.append(',');
property(input, (BinaryFieldDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
EJObject ejObject = ejval.isObject();
BinaryFieldDTO bf = new BinaryFieldDTO();
defaultProps(ejval.isObject(), bf);
bf.setEntityId(ejval.isObject().get("entityId").isString().stringValue());
if (ejObject.containsKey("height")) {
bf.setHeight(ejObject.get("height").isNumber().intValue());
}
if (ejObject.containsKey("useThumbnail")) {
bf.setUseThumbnail(ejObject.get("useThumbnail").isBoolean().booleanValue());
}
property(bf, ejval.isObject(), ctx);
return bf;
} else
return null;
}
@Override
public Class handleType() {
return BinaryFieldDTO.class;
}
@Override
public String typeName() {
return "binary";
}
},
date {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
DateFieldDTO df = (DateFieldDTO) val;
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (DateFieldDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
DateFieldDTO df = new DateFieldDTO();
defaultProps(ejval.isObject(), df);
property(df, ejval.isObject(), ctx);
return df;
} else
return null;
}
@Override
public Class handleType() {
return DateFieldDTO.class;
}
@Override
public String typeName() {
return "date";
}
},
repeatedform {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
RepeatedFormDTO repeated = (RepeatedFormDTO) val;
input.append('{');
defaultProps(input, val, this);
input.append(',');
MarshallingUtils.bool("defaultSortId", repeated.getDefaultSortId(), input).append(',');
MarshallingUtils.key("view", input).append(':');
Marshaller<Object> marsh = ctx.getMarshallerInstance(ViewDTO.class.getName());
input.append(marsh.marshall(repeated.getView(), ctx));
input.append(',');
property(input, (RepeatedFormDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
EJObject ejObject = ejval.isObject();
RepeatedFormDTO repForm = new RepeatedFormDTO();
defaultProps(ejval.isObject(), repForm);
if (ejObject.containsKey("defaultSortId") && (ejObject.get("defaultSortId").isBoolean() != null)) {
repForm.setDefaultSortId(ejObject.get("defaultSortId").isBoolean().booleanValue());
}
if (ejObject.containsKey("view")) {
Marshaller<Object> marsh = ctx.getMarshallerInstance(ViewDTO.class.getName());
Object view = marsh.demarshall(ejObject.get("view"), ctx);
repForm.setView((ViewDTO) view);
}
property(repForm, ejval.isObject(), ctx);
return repForm;
} else
return null;
}
@Override
public Class handleType() {
return RepeatedFormDTO.class;
}
@Override
public String typeName() {
return "repeated";
}
},
table {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val,
MarshallingSession ctx) {
TableDTO tbdo = (TableDTO) val;
input.append('{');
defaultProps(input, val, this);
input.append(',');
MarshallingUtils.number("height", tbdo.getHeight(), input).append(',');
MarshallingUtils.key("view", input).append(':');
Marshaller<Object> marsh = ctx.getMarshallerInstance(ViewDTO.class.getName());
input.append(marsh.marshall(tbdo.getView(), ctx));
input.append(',');
property(input, (TableDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
EJObject ejObject = ejval.isObject();
TableDTO td = new TableDTO();
defaultProps(ejval.isObject(), td);
if (ejObject.containsKey("height") && (ejObject.get("height").isNumber() != null)) {
td.setHeight(ejObject.get("height").isNumber().intValue());
}
if (ejObject.containsKey("view")) {
Marshaller<Object> marsh = ctx.getMarshallerInstance(ViewDTO.class.getName());
ViewDTO vdto = (ViewDTO) marsh.demarshall(ejObject.get("view"), ctx);
td.setView(vdto);
}
property(td, ejval.isObject(), ctx);
return td;
} else
return null;
}
@Override
public Class handleType() {
return TableDTO.class;
}
@Override
public String typeName() {
return "table";
}
},
textarea {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
TextAreaDTO table = (TextAreaDTO) val;
input.append('{');
defaultProps(input, val, this);
input.append(',');
MarshallingUtils.number("rows", table.getRows(), input);
input.append(',');
MarshallingUtils.number("height", table.getHeight(), input);
input.append(',');
property(input, (TextAreaDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
EJObject ejObject = ejval.isObject();
TextAreaDTO tDTO = new TextAreaDTO();
defaultProps(ejval.isObject(), tDTO);
if (ejObject.containsKey("rows")) {
tDTO.setRows(ejObject.get("rows").isNumber().intValue());
}
if (ejObject.containsKey("height")) {
tDTO.setHeight(ejObject.get("height").isNumber().intValue());
}
property(tDTO, ejval.isObject(), ctx);
return tDTO;
} else
return null;
}
@Override
public Class handleType() {
return TextAreaDTO.class;
}
@Override
public String typeName() {
return "textarea";
}
},
function {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
FunctionWidgetDTO fw = (FunctionWidgetDTO) val;
input.append('{');
defaultProps(input, val, this);
input.append(',');
MarshallingUtils.key("function", input).append(':');
Marshaller<Object> marshaller = ctx.getMarshallerInstance(FunctionDTO.class.getName());
input.append(marshaller.marshall(fw.getFunction(), ctx));
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
EJObject ejObject = ejval.isObject();
if (DemarshallingUtils.containsAndNotNull(ejObject, "function")) {
Marshaller<Object> marshaller = ctx.getMarshallerInstance(FunctionDTO.class.getName());
Object fdto = marshaller.demarshall(ejObject.get("function"), ctx);
FunctionWidgetDTO tDTO = new FunctionWidgetDTO((FunctionDTO) fdto);
defaultProps(ejval.isObject(), tDTO);
return tDTO;
} else
return null;
} else
return null;
}
@Override
public Class handleType() {
return FunctionWidgetDTO.class;
}
@Override
public String typeName() {
return "function";
}
},
textfield {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (TextFieldDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
TextFieldDTO tDTO = new TextFieldDTO();
defaultProps(ejval.isObject(), tDTO);
property(tDTO, ejval.isObject(), ctx);
return tDTO;
} else
return null;
}
@Override
public Class handleType() {
return TextFieldDTO.class;
}
@Override
public String typeName() {
return "textfield";
}
},
htmlfield {
@Override
public StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx) {
input.append('{');
defaultProps(input, val, this);
input.append(',');
property(input, (HtmlFieldDTO) val, ctx);
input.append('}');
return input;
}
@Override
public WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx) {
if (ejval.isObject() != null) {
HtmlFieldDTO tDTO = new HtmlFieldDTO();
defaultProps(ejval.isObject(), tDTO);
property(tDTO, ejval.isObject(), ctx);
return tDTO;
} else
return null;
}
@Override
public Class handleType() {
return HtmlFieldDTO.class;
}
@Override
public String typeName() {
return "htmlfield";
}
};
public abstract StringBuilder marshall(StringBuilder input, WidgetDTO val, MarshallingSession ctx);
public abstract WidgetDTO demarshall(EJValue ejval, MarshallingSession ctx);
public abstract Class handleType();
public abstract String typeName();
public static WidgetType lookup(WidgetDTO val) {
WidgetType[] vals = values();
for (WidgetType dt : vals) {
if (dt.handleType().equals(val.getClass())) {
return dt;
}
}
return null;
}
public static WidgetType lookup(EJValue val) {
if (val.isObject() != null) {
EJObject obj = val.isObject();
if (obj.containsKey(TYPE)) {
EJString ejString = obj.get(TYPE).isString();
if (ejString != null) {
WidgetType[] vals = values();
for (WidgetType wt : vals) {
if (wt.typeName().equals(ejString.stringValue())) {
return wt;
}
}
}
}
}
return null;
}
}
static void defaultProps(EJObject ejObj, WidgetDTO w) {
if (ejObj.containsKey("size") && (ejObj.get("size").isNumber() != null)) {
w.setSize(ejObj.get("size").isNumber().intValue());
}
if (ejObj.containsKey("formatPattern") && (ejObj.get("formatPattern").isString() != null)) {
w.setFormatPattern(ejObj.get("formatPattern").isString().stringValue());
}
if (ejObj.containsKey("localizedName") && (ejObj.get("localizedName").isString() != null)) {
w.setLocalizedName(ejObj.get("localizedName").isString().stringValue());
}
if (ejObj.containsKey("enabled") && (ejObj.get("enabled").isBoolean() != null)) {
w.setEnabled(ejObj.get("enabled").isBoolean().booleanValue());
}
}
static void defaultProps(StringBuilder builder, WidgetDTO w, WidgetType type) {
MarshallingUtils.number("size", w.getSize(), builder).append(',');
MarshallingUtils.string("formatPattern", w.getFormatPattern(), builder).append(',');
MarshallingUtils.string("localizedName", w.getLocalizedName(), builder).append(',');
MarshallingUtils.bool("enabled", w.isEnabled(), builder).append(',');
MarshallingUtils.string("type", type.typeName(), builder);
}
static void property(StringBuilder builder, WidgetPropertyDTOBase p, MarshallingSession ctx) {
MarshallingUtils.key("property", builder).append(':');
Marshaller<Object> marshaller = ctx.getMarshallerInstance(PropertyDTO.class.getName());
builder.append(marshaller.marshall(p.getProperty(), ctx));
}
static void property(WidgetPropertyDTOBase wbase, EJObject obj, MarshallingSession ctx) {
if (obj.containsKey("property")) {
Marshaller<Object> marshaller = ctx.getMarshallerInstance(PropertyDTO.class.getName());
wbase.setProperty((PropertyDTO) marshaller.demarshall(obj.get("property"), ctx));
}
}
static void children(StringBuilder builder, PanelDTO panel, MarshallingSession ctx) {
MarshallingUtils.key("children", builder).append(':').append('[');
List list = panel.getChildren();
boolean first = true;
for (Object o : list) {
WidgetDTO w = (WidgetDTO) o;
if (!first)
builder.append(',');
WidgetType wtype = WidgetType.lookup(w);
if (wtype != null) {
wtype.marshall(builder, w, ctx);
} else
throw new IllegalArgumentException("notsuported type '" + w.getClass().getName() + "'");
first = false;
}
builder.append(']');
}
static void children(EJObject ejObj, PanelDTO panel, MarshallingSession ctx) {
if (ejObj.containsKey("children")) {
List<WidgetDTO> children = new ArrayList<WidgetDTO>();
EJArray ejArray = ejObj.get("children").isArray();
if (ejArray != null) {
for (int i = 0, ll = ejArray.size(); i < ll; i++) {
EJValue value = ejArray.get(i);
WidgetType wType = WidgetType.lookup(value);
if (wType != null) {
WidgetDTO widget = wType.demarshall(value, ctx);
children.add(widget);
} else
throw new UnsupportedOperationException("type not supported");
}
}
panel.setChildren(children);
}
}
}