package com.revolsys.ui.html.serializer.key; import java.util.LinkedHashMap; import java.util.Map; import org.apache.log4j.Logger; import com.revolsys.datatype.DataTypes; import com.revolsys.record.io.format.xml.XmlWriter; import com.revolsys.ui.html.builder.HtmlUiBuilder; import com.revolsys.ui.html.builder.HtmlUiBuilderAware; public class PageLinkKeySerializer extends AbstractKeySerializer implements HtmlUiBuilderAware<HtmlUiBuilder<?>> { private String pageName; private final Map<String, String> parameterKeys = new LinkedHashMap<>(); private HtmlUiBuilder<?> uiBuilder; public PageLinkKeySerializer() { } public PageLinkKeySerializer(final String name, final String key, final String label, final String pageName) { super(name, label); setKey(key); setPageName(pageName); } public PageLinkKeySerializer addParameterKey(final String name, final String key) { this.parameterKeys.put(name, key); return this; } public String getPageName() { return this.pageName; } public Map<String, String> getParameterKeys() { return this.parameterKeys; } public HtmlUiBuilder<?> getUiBuilder() { return this.uiBuilder; } @Override public void serialize(final XmlWriter out, final Object object) { try { HtmlUiBuilder<? extends Object> uiBuilder = this.uiBuilder; final String[] parts = getKey().split("\\."); Object currentObject = object; String key = parts[0]; for (int i = 0; i < parts.length - 1; i++) { currentObject = uiBuilder.getProperty(currentObject, key); if (currentObject == null) { uiBuilder.serializeNullLabel(out, key); return; } uiBuilder = uiBuilder.getBuilder(currentObject); if (uiBuilder == null) { final Object value = currentObject; out.write(DataTypes.toString(value)); return; } key = parts[i + 1]; } uiBuilder.serializeLink(out, currentObject, key, this.pageName, this.parameterKeys); } catch (final Throwable e) { Logger.getLogger(getClass()).error("Unable to serialize " + this.pageName, e); } } public void serializeValue(final XmlWriter out) { out.text(getLabel()); } @Override public void setHtmlUiBuilder(final HtmlUiBuilder<?> uiBuilder) { if (this.uiBuilder == null) { this.uiBuilder = uiBuilder; } } public void setPageName(final String pageName) { this.pageName = pageName; } public PageLinkKeySerializer setParameterKeys(final Map<String, String> parameterKeys) { this.parameterKeys.putAll(parameterKeys); return this; } public PageLinkKeySerializer setUiBuilder(final HtmlUiBuilder<?> uiBuilder) { this.uiBuilder = uiBuilder; return this; } }