Java tutorial
/** * 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() { } }