cz.cuni.mff.ms.brodecva.botnicek.ide.translate.Stack.java Source code

Java tutorial

Introduction

Here is the source code for cz.cuni.mff.ms.brodecva.botnicek.ide.translate.Stack.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.translate;

import java.util.List;

import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;

import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.template.TemplateElement;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.template.implementations.Set;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.template.implementations.Text;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.template.implementations.Think;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.template.implementations.Topicstar;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.toplevel.Category;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.elements.toplevel.Topic;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.types.NormalWord;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.types.NormalWords;
import cz.cuni.mff.ms.brodecva.botnicek.ide.aiml.types.Patterns;
import cz.cuni.mff.ms.brodecva.botnicek.library.platform.AIML;

/**
 * <p>
 * Pomocn metody pro prci s virtulnm zsobnkem, kter je implementovn
 * pomoc porovnn vzor v?i tmatu.
 * </p>
 * <p>
 * Odebrn vrcholu je realizovno pomoc porovnn vzoru "VRCHOL *" v?i
 * aktulnmu tmatu, a uloen ?sti zachycen hvzdi?kou jakoto novho tmatu
 * </p>
 * <p>
 * Pidn vrcholu je realizovno uloenm konkatenace novho vrcholu a
 * aktulnho tmatu jakoto novho tmatu.
 * </p>
 * <p>
 * Metody slou pouze ke konstrukci modifika?nho kdu a neovuj, zda-li
 * vstup parametr vytvo validn strukturu zsobnku v promnn tmatu.
 * </p>
 * 
 * @author Vclav Brodec
 * @version 1.0
 * @see <a
 *      href="http://www.alicebot.org/TR/2011/#section-topic">http://www.alicebot.org/TR/2011/#section-topic</a>
 * @see <a
 *      href="http://www.alicebot.org/TR/2011/#section-aiml-pattern-matching">http://www.alicebot.org/TR/2011/#section-aiml-pattern-matching</a>
 */
public final class Stack {

    private static Joiner NORMAL_WORDS_JOINER = Joiner.on(AIML.WORD_DELIMITER.getValue());

    /**
     * Vrt strukturu, kter pi proveden nastav zsobnk podle parametr.
     * 
     * @param first
     *            prvky, jejich vstup bude pidn na za?tek zsobnku
     * @param second
     *            prvky, jejich vstup bude pidn za prvn, oddlen
     *            oddlova?em slov
     * @return strom prvk ablony, kter provede nastaven zsobnku
     */
    public static TemplateElement concatenate(final List<? extends TemplateElement> first,
            final List<? extends TemplateElement> second) {
        final Builder<TemplateElement> newStackBuilder = ImmutableList.builder();
        if (!first.isEmpty()) {
            newStackBuilder.addAll(first);
        }
        if (!first.isEmpty() && !second.isEmpty()) {
            newStackBuilder.add(Text.create(AIML.WORD_DELIMITER.getValue()));
        }
        if (!second.isEmpty()) {
            newStackBuilder.addAll(second);
        }

        return set(newStackBuilder.build());
    }

    /**
     * Vytvo tma, je bude volno pi stavu zsobnku, ve kterm se nachz
     * sloen nzev tmatu na vrcholu.
     * 
     * @param composedName
     *            sloen nzev tmatu
     * @param categories
     *            kategorie tmatu
     * @return tma stavu
     */
    public static Topic createState(final List<? extends NormalWord> composedName,
            final List<? extends Category> categories) {
        Preconditions.checkNotNull(composedName);
        Preconditions.checkNotNull(categories);

        final List<NormalWord> namesCopy = ImmutableList.copyOf(composedName);
        Preconditions.checkArgument(!composedName.isEmpty());

        return Topic.create(
                Patterns.create(Stack.joinWithSpaces(namesCopy) + AIML.WORD_DELIMITER + AIML.STAR_WILDCARD),
                ImmutableList.copyOf(categories));
    }

    /**
     * Vytvo tma, je bude volno pi stavu zsobnku, ve kterm se nachz
     * nzev tmatu na vrcholu.
     * 
     * @param name
     *            nzev tmatu
     * @param categories
     *            kategorie tmatu
     * @return tma stavu
     */
    public static Topic createState(final NormalWord name, final Category... categories) {
        Preconditions.checkNotNull(name);
        Preconditions.checkNotNull(categories);

        return createState(ImmutableList.of(name), ImmutableList.copyOf(categories));
    }

    /**
     * Spoj slova oddlova?em slov ve vzoru.
     * 
     * @param words
     *            normln slova
     * @return etzec z normlnch slov pospojovanch oddlova?em slov
     */
    public static String joinWithSpaces(final List<? extends NormalWord> words) {
        Preconditions.checkNotNull(words);

        final List<NormalWord> wordsCopy = ImmutableList.copyOf(words);

        return NORMAL_WORDS_JOINER.join(Collections2.transform(wordsCopy, new Function<NormalWord, String>() {
            @Override
            public String apply(final NormalWord input) {
                return input.getText();
            }
        }));
    }

    /**
     * Vrt strukturu, kter odebere vrchol zsobnku, pokud je provedena.
     * O?ekv, e zbytek zsobnku je zachycen olkem hvzdi?ka.
     * 
     * @return strom prvk ablony, kter provede odebrn vrcholu zsobnku
     */
    public static TemplateElement pop() {
        return Stack.set(Topicstar.create());
    }

    /**
     * Vrt strukturu, kter pid vsledek zpracovn prvk ablony na vrchol
     * zsobnku, pokud je provedena.
     * 
     * @param content
     *            prvky, je se maj zpracovat a vsledek uloit na zsobnk
     * @return strom prvk ablony, kter provede pidn vsledku na zsobnk
     */
    public static TemplateElement popAndPush(final List<? extends TemplateElement> content) {
        Preconditions.checkNotNull(content);

        return concatenate(ImmutableList.copyOf(content), ImmutableList.<TemplateElement>of(Topicstar.create()));
    }

    /**
     * Vrt strukturu, kter pid vsledek zpracovn prvk ablony na
     * uvolnn vrchol zsobnku, pokud je provedena.
     * 
     * @param content
     *            prvky, je se maj zpracovat a vsledek uloit na zsobnk
     * @return strom prvk ablony, kter provede pidn vsledku na zsobnk
     */
    public static TemplateElement popAndPush(final TemplateElement... content) {
        Preconditions.checkNotNull(content);

        return popAndPush(ImmutableList.copyOf(content));
    }

    /**
     * Vrt strukturu, kter pid slova na uvolnn vrchol zsobnku, pokud je
     * provedena.
     * 
     * @param words
     *            normln slova
     * @return strom prvk ablony, kter provede pidn slov na zsobnk
     */
    public static TemplateElement popAndPushWords(final List<? extends NormalWord> words) {
        Preconditions.checkNotNull(words);

        final ImmutableList<NormalWord> wordsCopy = ImmutableList.copyOf(words);

        if (wordsCopy.isEmpty()) {
            return popAndPush(ImmutableList.<TemplateElement>of());
        } else {
            return popAndPush(Text.create(joinWithSpaces(wordsCopy)));
        }
    }

    /**
     * Vrt strukturu, kter pid slova na uvolnn vrchol zsobnku, pokud je
     * provedena.
     * 
     * @param words
     *            normln slova
     * @return strom prvk ablony, kter provede pidn slov na zsobnk
     */
    public static TemplateElement popAndPushWords(final NormalWord... words) {
        Preconditions.checkNotNull(words);

        return popAndPushWords(ImmutableList.copyOf(words));
    }

    /**
     * Vrt strukturu, kter pi proveden nastav zsobnk podle parametr.
     * 
     * @param words
     *            nov slova na zsobnk
     * @param rest
     *            zbytek prvk, jejich vyhodnocen bude nastaveno do zsobnku
     * @return strom prvk ablony, kter provede nastaven zsobnku
     */
    public static TemplateElement prepend(final List<? extends NormalWord> words,
            final List<TemplateElement> rest) {
        Preconditions.checkNotNull(words);
        Preconditions.checkNotNull(rest);

        final List<NormalWord> contentCopy = ImmutableList.copyOf(words);

        if (contentCopy.isEmpty()) {
            return concatenate(ImmutableList.<TemplateElement>of(), rest);
        } else {
            final List<TemplateElement> pushedList = ImmutableList
                    .<TemplateElement>of(Text.create(joinWithSpaces(contentCopy)));
            return concatenate(pushedList, rest);
        }
    }

    /**
     * Nastav zsobnkem pi proveden vstupem prvk.
     * 
     * @param content
     *            prvky k vytvoen obsahu zsobnku
     * @return strom prvk, kter nastav zsobnk
     */
    public static TemplateElement set(final List<? extends TemplateElement> content) {
        Preconditions.checkNotNull(content);

        final Set update = Set.create(NormalWords.of(AIML.TOPIC_PREDICATE.getValue()),
                ImmutableList.copyOf(content));
        final Think hide = Think.create(update);

        return hide;
    }

    /**
     * Nastav zsobnkem pi proveden vstupem prvk.
     * 
     * @param content
     *            prvky k vytvoen obsahu zsobnku
     * @return strom prvk, kter nastav zsobnk
     */
    public static TemplateElement set(final TemplateElement... content) {
        Preconditions.checkNotNull(content);

        return set(ImmutableList.copyOf(content));
    }

    private Stack() {
    }
}