cz.cuni.mff.ms.brodecva.botnicek.ide.render.DefaultRenderingVisitor.java Source code

Java tutorial

Introduction

Here is the source code for cz.cuni.mff.ms.brodecva.botnicek.ide.render.DefaultRenderingVisitor.java

Source

/**
 * Copyright Vclav Brodec 2014.
 * 
 * This file is part of Botn?ek.
 * 
 * Botn?ek is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Botn?ek is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Botn?ek.  If not, see <http://www.gnu.org/licenses/>.
 */
package cz.cuni.mff.ms.brodecva.botnicek.ide.render;

import java.net.URI;
import java.util.Map;
import java.util.Set;

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;

import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.AbstractProperElement;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.AbstractRawElement;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.types.Attribute;
import cz.cuni.mff.ms.brodecva.botnicek.ide.utils.data.Presence;
import cz.cuni.mff.ms.brodecva.botnicek.library.platform.AIML;
import cz.cuni.mff.ms.brodecva.botnicek.library.platform.XML;

/**
 * Vchoz implementace nvtvnka generujcho zdrojov kd AIML z objektovho
 * modelu dokumentu.
 * 
 * @author Vclav Brodec
 * @version 1.0
 */
public final class DefaultRenderingVisitor implements RenderingVisitor {

    /**
     * Vytvo nvtvnka.
     * 
     * @param namespacesToPrefixes
     *            nastaven prefix pro prostory jmen prvk
     * @return nvtvnk
     */
    public static DefaultRenderingVisitor create(final Map<? extends URI, ? extends String> namespacesToPrefixes) {
        return new DefaultRenderingVisitor(namespacesToPrefixes);
    }

    private final StringBuilder output = new StringBuilder();

    private final Map<URI, String> namespacesToPrefixes;

    private DefaultRenderingVisitor(final Map<? extends URI, ? extends String> namespacesToPrefixes) {
        Preconditions.checkNotNull(namespacesToPrefixes);

        final ImmutableMap<URI, String> namespacesToPrefixesCopy = ImmutableMap.copyOf(namespacesToPrefixes);
        Preconditions
                .checkArgument(namespacesToPrefixesCopy.containsKey(URI.create(AIML.NAMESPACE_URI.getValue())));

        this.namespacesToPrefixes = namespacesToPrefixesCopy;
    }

    private void appendName(final AbstractProperElement element) {
        final String aimlPrefix = this.namespacesToPrefixes.get(URI.create(AIML.NAMESPACE_URI.getValue()));
        assert Presence.isPresent(aimlPrefix);

        if (!aimlPrefix.isEmpty()) {
            this.output.append(aimlPrefix);
            this.output.append(XML.PREFIX_DELIMITER);
        }
        this.output.append(element.getLocalName());
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * cz.cuni.mff.ms.brodecva.botnicek.ide.render.RenderingVisitor#getResult()
     */
    @Override
    public String getResult() {
        return this.output.toString();
    }

    private void renderAttributes(final Set<Attribute> attributes) {
        for (final Attribute attribute : attributes) {
            this.output.append(XML.SPACE);

            final URI namespace = attribute.getNamespace();
            if (Presence.isPresent(namespace)) {
                final String prefix = this.namespacesToPrefixes.get(namespace);
                Preconditions.checkArgument(Presence.isPresent(prefix));

                if (!prefix.isEmpty()) {
                    this.output.append(prefix);
                    this.output.append(XML.PREFIX_DELIMITER);
                }
            }

            this.output.append(attribute.getName());
            this.output.append(XML.EQ_SIGN);
            this.output.append(XML.QUOTE);
            this.output.append(attribute.getValue());
            this.output.append(XML.QUOTE);
        }
    }

    /**
     * {@inheritDoc}
     * 
     * <p>
     * Sestav textovou podobu otevrac zna?ky prvku, v?etn atribut.
     * </p>
     */
    @Override
    public void visitEnter(final AbstractProperElement element) {
        this.output.append(XML.TAG_START);

        appendName(element);

        renderAttributes(element.getAttributes());

        if (element.hasChildren()) {
            this.output.append(XML.TAG_END);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * cz.cuni.mff.ms.brodecva.botnicek.ide.designer.models.aiml.api.Visitor
     * #visitEnter
     * (cz.cuni.mff.ms.brodecva.botnicek.ide.designer.models.aiml.elements
     * .AbstractRawElement)
     */
    @Override
    public void visitEnter(final AbstractRawElement element) {
        this.output.append(element.getText());
    }

    /**
     * {@inheritDoc}
     * 
     * <p>
     * Sestav textovou podobu koncov zna?ky prvku (zkrcen verze v ppad,
     * e prvek nem potomky).
     * </p>
     */
    @Override
    public void visitExit(final AbstractProperElement element) {
        if (element.hasChildren()) {
            this.output.append(XML.CLOSING_TAG_START);

            appendName(element);

            this.output.append(XML.TAG_END);
        } else {
            this.output.append(XML.EMPTY_TAG_END);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * cz.cuni.mff.ms.brodecva.botnicek.ide.designer.models.aiml.api.Visitor
     * #visitExit
     * (cz.cuni.mff.ms.brodecva.botnicek.ide.designer.models.aiml.elements
     * .AbstractRawElement)
     */
    @Override
    public void visitExit(final AbstractRawElement element) {
    }
}