/*******************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *******************************************************************************/
package org.ofbiz.widget.model;

import java.util.Collection;
import java.util.Map;

import org.ofbiz.widget.model.HtmlWidget.HtmlTemplate;
import org.ofbiz.widget.model.HtmlWidget.HtmlTemplateDecorator;
import org.ofbiz.widget.model.HtmlWidget.HtmlTemplateDecoratorSection;
import org.ofbiz.widget.model.ModelScreenWidget.Column;
import org.ofbiz.widget.model.ModelScreenWidget.ColumnContainer;
import org.ofbiz.widget.model.ModelScreenWidget.Container;
import org.ofbiz.widget.model.ModelScreenWidget.Content;
import org.ofbiz.widget.model.ModelScreenWidget.DecoratorScreen;
import org.ofbiz.widget.model.ModelScreenWidget.DecoratorSection;
import org.ofbiz.widget.model.ModelScreenWidget.DecoratorSectionInclude;
import org.ofbiz.widget.model.ModelScreenWidget.Form;
import org.ofbiz.widget.model.ModelScreenWidget.HorizontalSeparator;
import org.ofbiz.widget.model.ModelScreenWidget.IncludeScreen;
import org.ofbiz.widget.model.ModelScreenWidget.Label;
import org.ofbiz.widget.model.ModelScreenWidget.Menu;
import org.ofbiz.widget.model.ModelScreenWidget.PlatformSpecific;
import org.ofbiz.widget.model.ModelScreenWidget.PortalPage;
import org.ofbiz.widget.model.ModelScreenWidget.ScreenImage;
import org.ofbiz.widget.model.ModelScreenWidget.ScreenLink;
import org.ofbiz.widget.model.ModelScreenWidget.Screenlet;
import org.ofbiz.widget.model.ModelScreenWidget.Section;
import org.ofbiz.widget.model.ModelScreenWidget.Tree;
import org.ofbiz.widget.model.ModelTree.ModelNode;
import org.ofbiz.widget.model.ModelTree.ModelNode.ModelSubNode;

/**
 * An object that generates an XML representation from widget models.
 * The generated XML is unformatted - if you want to
 * "pretty print" the XML, then use a transformer.
 *
 */
public class XmlWidgetVisitor extends XmlAbstractWidgetVisitor implements ModelWidgetVisitor {

    private final ModelFieldVisitor fieldVisitor;
    private final ModelActionVisitor actionVisitor;
    private final ModelConditionVisitor conditionVisitor;

    public XmlWidgetVisitor(Appendable writer) {
        super(writer);
        this.fieldVisitor = new XmlWidgetFieldVisitor(writer);
        this.actionVisitor = new XmlWidgetActionVisitor(writer);
        this.conditionVisitor = new XmlWidgetConditionVisitor(writer);
    }

    @Override
    public void visit(Column column) throws Exception {
        writer.append("<column");
        visitModelWidget(column);
        visitAttribute("id", column.getIdExdr());
        visitAttribute("style", column.getStyleExdr());
        writer.append(">");
        visitSubWidgets(column.getSubWidgets());
        writer.append("</column>");
    }

    @Override
    public void visit(ColumnContainer columnContainer) throws Exception {
        writer.append("<column-container");
        visitModelWidget(columnContainer);
        visitAttribute("id", columnContainer.getIdExdr());
        visitAttribute("style", columnContainer.getStyleExdr());
        writer.append(">");
        visitSubWidgets(columnContainer.getColumns());
        writer.append("</column-container>");
    }

    @Override
    public void visit(Container container) throws Exception {
        writer.append("<container");
        visitModelWidget(container);
        visitAttribute("auto-update-interval", container.getAutoUpdateInterval());
        visitAttribute("auto-update-target", container.getAutoUpdateTargetExdr());
        visitAttribute("id", container.getIdExdr());
        visitAttribute("style", container.getStyleExdr());
        writer.append(">");
        visitSubWidgets(container.getSubWidgets());
        writer.append("</container>");
    }

    @Override
    public void visit(Content content) throws Exception {
        writer.append("<content");
        visitModelWidget(content);
        visitAttribute("border", content.getBorder());
        visitAttribute("content-id", content.getContentId());
        visitAttribute("dataresource-id", content.getDataResourceId());
        visitAttribute("edit-container-style", content.getEditContainerStyle());
        visitAttribute("edit-request", content.getEditRequest());
        visitAttribute("enable-edit-name", content.getEnableEditName());
        visitAttribute("height", content.getHeight());
        visitAttribute("width", content.getWidth());
        visitAttribute("xml-escape", content.xmlEscape());
        writer.append("/>");
    }

    @Override
    public void visit(DecoratorScreen decoratorScreen) throws Exception {
        writer.append("<decorator-screen");
        visitModelWidget(decoratorScreen);
        visitAttribute("location", decoratorScreen.getLocationExdr());
        writer.append(">");
        visitSubWidgets(decoratorScreen.getSectionMap().values());
        writer.append("</decorator-screen>");
    }

    @Override
    public void visit(DecoratorSection decoratorSection) throws Exception {
        writer.append("<decorator-section");
        visitModelWidget(decoratorSection);
        writer.append(">");
        visitSubWidgets(decoratorSection.getSubWidgets());
        writer.append("</decorator-screen>");
    }

    @Override
    public void visit(DecoratorSectionInclude decoratorSectionInclude) throws Exception {
        writer.append("<decorator-section-include");
        visitModelWidget(decoratorSectionInclude);
        writer.append("/>");
    }

    @Override
    public void visit(Form form) throws Exception {
        writer.append("<include-form");
        visitModelWidget(form);
        visitAttribute("location", form.getLocationExdr());
        visitAttribute("share-scope", form.getShareScopeExdr());
        writer.append("/>");
    }

    @Override
    public void visit(HorizontalSeparator horizontalSeparator) throws Exception {
        writer.append("<horizontal-separator");
        visitModelWidget(horizontalSeparator);
        visitAttribute("id", horizontalSeparator.getIdExdr());
        visitAttribute("style", horizontalSeparator.getStyleExdr());
        writer.append("/>");
    }

    @Override
    public void visit(HtmlTemplate htmlTemplate) throws Exception {
        writer.append("<html-template");
        visitModelWidget(htmlTemplate);
        visitAttribute("location", htmlTemplate.getLocationExdr());
        writer.append("/>");
    }

    @Override
    public void visit(HtmlTemplateDecorator htmlTemplateDecorator) throws Exception {
        writer.append("<html-template-decorator");
        visitModelWidget(htmlTemplateDecorator);
        visitAttribute("location", htmlTemplateDecorator.getLocationExdr());
        writer.append(">");
        visitSubWidgets(htmlTemplateDecorator.getSectionMap().values());
        writer.append("</html-template-decorator>");
    }

    @Override
    public void visit(HtmlTemplateDecoratorSection htmlTemplateDecoratorSection) throws Exception {
        writer.append("<html-template-decorator-section");
        visitModelWidget(htmlTemplateDecoratorSection);
        writer.append(">");
        visitSubWidgets(htmlTemplateDecoratorSection.getSubWidgets());
        writer.append("</html-template-decorator-section>");
    }

    @Override
    public void visit(HtmlWidget htmlWidget) throws Exception {
        visitSubWidgets(htmlWidget.getSubWidgets());
    }

    @Override
    public void visit(IncludeScreen includeScreen) throws Exception {
        writer.append("<include-screen");
        visitModelWidget(includeScreen);
        visitAttribute("location", includeScreen.getLocationExdr());
        visitAttribute("share-scope", includeScreen.getShareScopeExdr());
        writer.append("/>");
    }

    @Override
    public void visit(IterateSectionWidget iterateSectionWidget) throws Exception {
        writer.append("<iterate-section");
        visitModelWidget(iterateSectionWidget);
        visitAttribute("entry", iterateSectionWidget.getEntryNameExdr());
        visitAttribute("key", iterateSectionWidget.getKeyNameExdr());
        visitAttribute("list", iterateSectionWidget.getListNameExdr());
        visitAttribute("paginate", iterateSectionWidget.getPaginate());
        visitAttribute("paginate-target", iterateSectionWidget.getPaginateTarget());
        visitAttribute("view-size", iterateSectionWidget.getViewSize());
        writer.append(">");
        visitSubWidgets(iterateSectionWidget.getSectionList());
        writer.append("</iterate-section>");
    }

    @Override
    public void visit(Label label) throws Exception {
        writer.append("<label");
        visitModelWidget(label);
        visitAttribute("id", label.getIdExdr());
        visitAttribute("style", label.getStyleExdr());
        writer.append(">");
        writer.append(label.getTextExdr().getOriginal());
        writer.append("</label>");
    }

    @Override
    public void visit(Menu menu) throws Exception {
        writer.append("<include-menu");
        visitModelWidget(menu);
        visitAttribute("location", menu.getLocationExdr());
        writer.append("/>");
    }

    @Override
    public void visit(ModelForm modelForm) throws Exception {
        writer.append("<form");
        visitModelWidget(modelForm);
        if (modelForm.getParentModelForm() != null) {
            visitAttribute("extends", modelForm.getParentModelForm().getName());
            visitAttribute("extends-resource", modelForm.getParentModelForm().getFormLocation());
        }
        visitAttribute("view-size", modelForm.getDefaultViewSize());
        visitAttribute("type", modelForm.getType());
        visitAttribute("target", modelForm.getTarget());
        visitAttribute("id", modelForm.getContainerId());
        visitAttribute("style", modelForm.getContainerStyle());
        visitAttribute("title", modelForm.getTitle());
        visitAttribute("tooltip", modelForm.getTooltip());
        visitAttribute("list-name", modelForm.getListName());
        visitAttribute("list-entry-name", modelForm.getListEntryName());
        visitAttribute("default-entity-name", modelForm.getDefaultEntityName());
        visitAttribute("default-service-name", modelForm.getDefaultServiceName());
        visitAttribute("form-title-area-style", modelForm.getFormTitleAreaStyle());
        visitAttribute("form-widget-area-style", modelForm.getFormWidgetAreaStyle());
        visitAttribute("default-title-area-style", modelForm.getDefaultTitleAreaStyle());
        visitAttribute("default-widget-area-style", modelForm.getDefaultWidgetAreaStyle());
        visitAttribute("odd-row-style", modelForm.getOddRowStyle());
        visitAttribute("even-row-style", modelForm.getEvenRowStyle());
        visitAttribute("default-table-style", modelForm.getDefaultTableStyle());
        visitAttribute("header-row-style", modelForm.getHeaderRowStyle());
        visitAttribute("default-title-style", modelForm.getDefaultTitleStyle());
        visitAttribute("default-widget-style", modelForm.getDefaultWidgetStyle());
        visitAttribute("default-tooltip-style", modelForm.getDefaultTooltipStyle());
        visitAttribute("item-index-separator", modelForm.getItemIndexSeparator());
        visitAttribute("separate-columns", modelForm.getSeparateColumns());
        visitAttribute("group-columns", modelForm.getGroupColumns());
        visitAttribute("target-type", modelForm.getTargetType());
        visitAttribute("default-map-name", modelForm.getDefaultMapName());
        visitAttribute("target-window", modelForm.getTargetWindow());
        visitAttribute("hide-header", modelForm.getHideHeader());
        visitAttribute("client-autocomplete-fields", modelForm.getClientAutocompleteFields());
        visitAttribute("paginate-target", modelForm.getPaginateTarget());
        visitAttribute("sort-field-parameter-name", modelForm.getSortFieldParameterName());
        visitAttribute("default-required-field-style", modelForm.getDefaultRequiredFieldStyle());
        visitAttribute("default-sort-field-style", modelForm.getDefaultSortFieldStyle());
        visitAttribute("default-sort-field-asc-style", modelForm.getDefaultSortFieldAscStyle());
        visitAttribute("default-sort-field-desc-style", modelForm.getDefaultSortFieldDescStyle());
        visitAttribute("paginate-target-anchor", modelForm.getPaginateTargetAnchor());
        visitAttribute("paginate-index-field", modelForm.getPaginateIndexField());
        visitAttribute("paginate-size-field", modelForm.getPaginateSizeField());
        visitAttribute("override-list-size", modelForm.getOverrideListSize());
        visitAttribute("paginate-first-label", modelForm.getPaginateFirstLabel());
        visitAttribute("paginate-previous-label", modelForm.getPaginatePreviousLabel());
        visitAttribute("paginate-next-label", modelForm.getPaginateNextLabel());
        visitAttribute("paginate-last-label", modelForm.getPaginateLastLabel());
        visitAttribute("paginate-viewsize-label", modelForm.getPaginateViewSizeLabel());
        visitAttribute("paginate-style", modelForm.getPaginateStyle());
        visitAttribute("paginate", modelForm.getPaginate());
        visitAttribute("skip-start", modelForm.getSkipStart());
        visitAttribute("skip-end", modelForm.getSkipEnd());
        visitAttribute("use-row-submit", modelForm.getUseRowSubmit());
        visitAttribute("row-count", modelForm.getRowCount());
        visitAttribute("focus-field-name", modelForm.getFocusFieldName());
        writer.append(">");
        if (!modelForm.getActions().isEmpty()) {
            writer.append("<actions>");
            visitActions(modelForm.getActions());
            writer.append("</actions>");
        }
        if (!modelForm.getRowActions().isEmpty()) {
            writer.append("<row-actions>");
            visitActions(modelForm.getRowActions());
            writer.append("</row-actions>");
        }
        for (ModelForm.AltRowStyle rowStyle : modelForm.getAltRowStyles()) {
            writer.append("<alt-row-style");
            visitAttribute("use-when", rowStyle.useWhen);
            visitAttribute("style", rowStyle.style);
            writer.append("/>");
        }
        for (ModelForm.AltTarget target : modelForm.getAltTargets()) {
            writer.append("<alt-target");
            visitAttribute("use-when", target.useWhen);
            visitAttribute("target", target.targetExdr);
            writer.append("/>");
        }
        for (ModelForm.AutoFieldsService service : modelForm.getAutoFieldsServices()) {
            writer.append("<auto-fields-service");
            visitAttribute("service-name", service.serviceName);
            visitAttribute("map-name", service.mapName);
            visitAttribute("default-field-type", service.defaultFieldType);
            visitAttribute("default-position", service.defaultPosition);
            writer.append("/>");
        }
        for (ModelForm.AutoFieldsEntity entity : modelForm.getAutoFieldsEntities()) {
            writer.append("<auto-fields-entity");
            visitAttribute("entity-name", entity.entityName);
            visitAttribute("map-name", entity.mapName);
            visitAttribute("default-field-type", entity.defaultFieldType);
            visitAttribute("default-position", entity.defaultPosition);
            writer.append("/>");
        }
        for (ModelFormField field : modelForm.getFieldList()) {
            field.getFieldInfo().accept(fieldVisitor);
        }
        visitUpdateAreas(modelForm.getOnPaginateUpdateAreas());
        visitUpdateAreas(modelForm.getOnSortColumnUpdateAreas());
        visitUpdateAreas(modelForm.getOnSubmitUpdateAreas());
        writer.append("</form>");
    }

    @Override
    public void visit(ModelMenu modelMenu) throws Exception {
        writer.append("<menu");
        visitModelWidget(modelMenu);
        if (modelMenu.getParentMenu() != null) {
            visitAttribute("extends", modelMenu.getParentMenu().getName());
            visitAttribute("extends-resource", modelMenu.getParentMenu().getMenuLocation());
        }
        visitAttribute("type", modelMenu.getType());
        visitAttribute("target", modelMenu.getTarget());
        visitAttribute("id", modelMenu.getId());
        visitAttribute("title", modelMenu.getTitle());
        visitAttribute("tooltip", modelMenu.getTooltip());
        visitAttribute("default-entity-name", modelMenu.getDefaultEntityName());
        visitAttribute("default-title-style", modelMenu.getDefaultTitleStyle());
        visitAttribute("default-selected-style", modelMenu.getDefaultSelectedStyle());
        visitAttribute("default-widget-style", modelMenu.getDefaultWidgetStyle());
        visitAttribute("default-tooltip-style", modelMenu.getDefaultTooltipStyle());
        visitAttribute("default-menu-item-name", modelMenu.getDefaultMenuItemName());
        visitAttribute("default-permission-operation", modelMenu.getDefaultPermissionOperation());
        visitAttribute("default-permission-entity-action", modelMenu.getDefaultPermissionEntityAction());
        visitAttribute("default-associated-content-id", modelMenu.getDefaultAssociatedContentId());
        visitAttribute("orientation", modelMenu.getOrientation());
        visitAttribute("menu-width", modelMenu.getMenuWidth());
        visitAttribute("default-cell-width", modelMenu.getDefaultCellWidth());
        visitAttribute("default-hide-if-selected", modelMenu.getDefaultHideIfSelected());
        visitAttribute("default-disabled-title-style", modelMenu.getDefaultDisabledTitleStyle());
        visitAttribute("selected-menuitem-context-field-name", modelMenu.getSelectedMenuItemContextFieldName());
        visitAttribute("menu-container-style", modelMenu.getMenuContainerStyleExdr());
        visitAttribute("default-align", modelMenu.getDefaultAlign());
        visitAttribute("default-align-style", modelMenu.getDefaultAlignStyle());
        visitAttribute("fill-style", modelMenu.getFillStyle());
        visitAttribute("extra-index", modelMenu.getExtraIndex());
        writer.append(">");
        if (!modelMenu.getActions().isEmpty()) {
            writer.append("<actions>");
            visitActions(modelMenu.getActions());
            writer.append("</actions>");
        }
        for (ModelMenuItem menuItem : modelMenu.getMenuItemList()) {
            menuItem.accept(this);
        }
        writer.append("</menu>");
    }

    @Override
    public void visit(ModelMenuItem modelMenuItem) throws Exception {
        writer.append("<menu-item");
        visitModelWidget(modelMenuItem);
        visitAttribute("entity-name", modelMenuItem.getEntityName());
        visitAttribute("title", modelMenuItem.getTitle());
        visitAttribute("tooltip", modelMenuItem.getTooltip());
        visitAttribute("parent-portal-page-value", modelMenuItem.getParentPortalPageId());
        visitAttribute("title-style", modelMenuItem.getTitleStyle());
        visitAttribute("disabled-title-style", modelMenuItem.getDisabledTitleStyle());
        visitAttribute("widget-style", modelMenuItem.getWidgetStyle());
        visitAttribute("tooltip-style", modelMenuItem.getTooltipStyle());
        visitAttribute("selected-style", modelMenuItem.getSelectedStyle());
        visitAttribute("hide-if-selected", modelMenuItem.getHideIfSelected());
        visitAttribute("disable-if-empty", modelMenuItem.getDisableIfEmpty());
        visitAttribute("align", modelMenuItem.getAlign());
        visitAttribute("align-style", modelMenuItem.getAlignStyle());
        visitAttribute("position", modelMenuItem.getPosition());
        visitAttribute("associated-content-id", modelMenuItem.getAssociatedContentId());
        visitAttribute("cell-width", modelMenuItem.getCellWidth());
        visitAttribute("sub-menu", modelMenuItem.getSubMenu());
        writer.append(">");
        if (modelMenuItem.getCondition() != null) {
            modelMenuItem.getCondition().getCondition().accept(conditionVisitor);
        }
        if (!modelMenuItem.getActions().isEmpty()) {
            writer.append("<actions>");
            visitActions(modelMenuItem.getActions());
            writer.append("</actions>");
        }
        if (modelMenuItem.getLink() != null) {
            visitLink(modelMenuItem.getLink().getLink());
        }
        for (ModelMenuItem menuItem : modelMenuItem.getMenuItemList()) {
            menuItem.accept(this);
            ;
        }
        writer.append("</menu-item>");
    }

    @Override
    public void visit(ModelNode modelNode) throws Exception {
        writer.append("<node");
        visitModelWidget(modelNode);
        visitAttribute("expand-collapse-style", modelNode.getExpandCollapseStyle());
        visitAttribute("wrap-style", modelNode.getWrapStyleExdr());
        visitAttribute("render-style", modelNode.getRenderStyle());
        visitAttribute("entry-name", modelNode.getEntryName());
        visitAttribute("entity-name", modelNode.getEntityName());
        visitAttribute("join-field-name", modelNode.getPkName());
        writer.append(">");
        if (modelNode.getCondition() != null) {
            modelNode.getCondition().getCondition().accept(conditionVisitor);
        }
        if (!modelNode.getActions().isEmpty()) {
            writer.append("<actions>");
            visitActions(modelNode.getActions());
            writer.append("</actions>");
        }
        if (!modelNode.getScreenNameExdr().isEmpty()) {
            writer.append("<include-screen");
            visitAttribute("name", modelNode.getScreenNameExdr());
            visitAttribute("location", modelNode.getScreenLocationExdr());
            visitAttribute("share-scope", modelNode.getShareScope());
            visitAttribute("name", modelNode.getScreenNameExdr());
            writer.append("/>");
        }
        if (modelNode.getLabel() != null) {
            ModelNode.Label label = modelNode.getLabel();
            writer.append("<label");
            visitAttribute("id", label.getIdExdr());
            visitAttribute("style", label.getStyleExdr());
            writer.append(">");
            writer.append(label.getTextExdr().getOriginal());
            writer.append("</label>");
        }
        if (modelNode.getLink() != null) {
            ModelNode.Link link = modelNode.getLink();
            writer.append("<link");
            visitAttribute("encode", link.getEncode());
            visitAttribute("full-path", link.getFullPath());
            visitAttribute("id", link.getIdExdr());
            visitAttribute("link-type", link.getLinkType());
            visitAttribute("prefix", link.getPrefixExdr());
            visitAttribute("secure", link.getSecure());
            visitAttribute("style", link.getStyleExdr());
            visitAttribute("target", link.getTargetExdr());
            visitAttribute("target-window", link.getTargetWindowExdr());
            visitAttribute("text", link.getTextExdr());
            visitAttribute("url-mode", link.getUrlMode());
            if (!link.getParameterList().isEmpty()) {
                writer.append(">");
                visitParameters(link.getParameterList());
                writer.append("</link>");
            } else {
                writer.append("/>");
            }
        }
        writer.append("</node>");
    }

    @Override
    public void visit(ModelScreen modelScreen) throws Exception {
        writer.append("<screen");
        visitModelWidget(modelScreen);
        visitAttribute("transaction-timeout", modelScreen.getTransactionTimeout());
        visitAttribute("use-transaction", modelScreen.getUseTransaction());
        visitAttribute("use-cache", modelScreen.getUseCache());
        writer.append(">");
        modelScreen.getSection().accept(this);
        writer.append("</screen>");
    }

    @Override
    public void visit(ModelSubNode modelSubNode) throws Exception {
        writer.append("<sub-node");
        visitModelWidget(modelSubNode);
        visitAttribute("node-name", modelSubNode.getNodeNameExdr());
        writer.append(">");
        if (!modelSubNode.getActions().isEmpty()) {
            writer.append("<actions>");
            visitActions(modelSubNode.getActions());
            writer.append("</actions>");
        }
        writer.append("</sub-node>");
    }

    @Override
    public void visit(ModelTree modelTree) throws Exception {
        writer.append("<tree");
        visitModelWidget(modelTree);
        visitAttribute("root-node-name", modelTree.getRootNodeName());
        visitAttribute("default-render-style", modelTree.getDefaultRenderStyle());
        visitAttribute("render-style", modelTree.getDefaultRenderStyle());
        visitAttribute("default-wrap-style", modelTree.getDefaultWrapStyleExdr());
        visitAttribute("expand-collapse-request", modelTree.getExpandCollapseRequestExdr());
        visitAttribute("trail-name", modelTree.getTrailNameExdr());
        visitAttribute("force-child-check", modelTree.getForceChildCheck());
        visitAttribute("entity-name", modelTree.getDefaultEntityName());
        visitAttribute("open-depth", modelTree.getOpenDepth());
        visitAttribute("post-trail-open-depth", modelTree.getPostTrailOpenDepth());
        writer.append(">");
        visitSubWidgets(modelTree.getNodeMap().values());
        writer.append("</tree>");
    }

    @Override
    public void visit(PlatformSpecific platformSpecific) throws Exception {
        writer.append("<platform-specific>");
        for (Map.Entry<String, ModelScreenWidget> entry : platformSpecific.getSubWidgets().entrySet()) {
            writer.append("<").append(entry.getKey()).append(">");
            entry.getValue().accept(this);
            writer.append("</").append(entry.getKey()).append(">");
        }
        writer.append("</platform-specific>");
    }

    @Override
    public void visit(PortalPage portalPage) throws Exception {
        writer.append("<include-portal-page");
        visitModelWidget(portalPage);
        visitAttribute("id", portalPage.getIdExdr());
        visitAttribute("conf-mode", portalPage.getConfModeExdr());
        visitAttribute("use-private", portalPage.getUsePrivate());
        writer.append("/>");
    }

    @Override
    public void visit(ScreenImage image) throws Exception {
        visitImage(image.getImage());
    }

    @Override
    public void visit(Screenlet screenlet) throws Exception {
        writer.append("<screenlet");
        visitModelWidget(screenlet);
        visitAttribute("id", screenlet.getIdExdr());
        visitAttribute("collapsible", screenlet.getCollapsible());
        visitAttribute("initially-collapsed", screenlet.getInitiallyCollapsed());
        visitAttribute("save-collapsed", screenlet.getSaveCollapsed());
        visitAttribute("padded", screenlet.getPadded());
        visitAttribute("title", screenlet.getTitleExdr());
        writer.append(">");
        visitSubWidgets(screenlet.getSubWidgets());
        writer.append("</screenlet>");
    }

    @Override
    public void visit(ScreenLink link) throws Exception {
        visitLink(link.getLink());
    }

    @Override
    public void visit(Section section) throws Exception {
        writer.append("<section");
        visitModelWidget(section);
        writer.append(">");
        if (section.getCondition() != null) {
            writer.append("<condition>");
            section.getCondition().accept(conditionVisitor);
            writer.append("</condition>");
        }
        if (!section.getActions().isEmpty()) {
            writer.append("<actions>");
            visitActions(section.getActions());
            writer.append("</actions>");
        }
        if (!section.getSubWidgets().isEmpty()) {
            writer.append("<widgets>");
            visitSubWidgets(section.getSubWidgets());
            writer.append("</widgets>");
        }
        if (!section.getFailWidgets().isEmpty()) {
            writer.append("<fail-widgets>");
            visitSubWidgets(section.getFailWidgets());
            writer.append("</fail-widgets>");
        }
        writer.append("</section>");
    }

    @Override
    public void visit(Tree tree) throws Exception {
        writer.append("<include-tree");
        visitModelWidget(tree);
        visitAttribute("location", tree.getLocationExdr());
        visitAttribute("share-scope", tree.getShareScopeExdr());
        writer.append("/>");
    }

    private void visitActions(Collection<? extends ModelAction> actions) throws Exception {
        for (ModelAction action : actions) {
            action.accept(actionVisitor);
        }
    }

    private void visitSubWidgets(Collection<? extends ModelWidget> subWidgets) throws Exception {
        for (ModelWidget subWidget : subWidgets) {
            subWidget.accept(this);
        }
    }

    private void visitUpdateAreas(Collection<ModelForm.UpdateArea> updateAreas) throws Exception {
        for (ModelForm.UpdateArea updateArea : updateAreas) {
            writer.append("<on-event-update-area");
            visitAttribute("event-type", updateArea.getEventType());
            visitAttribute("area-id", updateArea.getAreaId());
            visitAttribute("area-target", updateArea.getAreaTarget());
            writer.append(">");
            visitAutoEntityParameters(updateArea.getAutoEntityParameters());
            visitAutoServiceParameters(updateArea.getAutoServiceParameters());
            visitParameters(updateArea.getParameterList());
            writer.append("</on-event-update-area>");
        }
    }
}
