package ru.foror.articles.tapestry.blog.pages.admin.form; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.configuration.Configuration; import org.apache.tapestry5.ValueEncoder; import org.apache.tapestry5.annotations.Meta; import org.apache.tapestry5.annotations.OnEvent; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.corelib.mixins.Autocomplete; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.ValueEncoderSource; import ru.foror.articles.common.domain.Category; import ru.foror.articles.common.operations.ITagOperations; import ru.foror.articles.common.operations.IUniversalOperations; import ru.foror.articles.common.tapestry.common.SelectModel; import ru.foror.articles.tapestry.blog.common.AdminMenu; import ru.foror.articles.tapestry.blog.domain.Article; import ru.foror.articles.tapestry.blog.domain.Tag; import ru.foror.articles.tapestry.blog.operations.IAccountOperations; import ru.foror.articles.tapestry.blog.operations.IArticleOperations; import ru.foror.articles.tapestry.blog.pages.admin.grid.Articles; /** * Форма для добавления/редактирования статьи. * * @author Alexey Pomogaev foror@mail.ru */ @Meta({"admin=true"}) public class FormArticle { @Inject private IUniversalOperations universalOp; @Inject private IAccountOperations accountOp; @Inject private IArticleOperations articleOp; @Inject private ValueEncoderSource encoder; @Inject private Configuration config; @Property private Article article; @Property private String additionTags; @Property private List tags; /** * Если страница без контекста, то подготавливает объект для добавления. */ @OnEvent("activate") void create() { article = new Article(); init(); } /** * Если страница с контекстом в виде идентификатора статьи, то подготавливает * объект для редактирования. */ @OnEvent("activate") void edit(long id) { article = universalOp.get(Article.class, id); init(); } Object onPassivate() { return article == null || article.getId() == null ? null : article.getId(); } @SuppressWarnings("unchecked") void init() { if (article.getAuthor() == null) { article.setAuthor(accountOp.getLoginAccount()); } if (CollectionUtils.isEmpty(tags)) { tags = (List) article.getTags(); } } public SelectModel getCategoryModel() { return new SelectModel(universalOp.get(Category.class)); } public ValueEncoder getCategoryEncoder() { return encoder.getValueEncoder(Category.class); } public SelectModel getTagModel() { return new SelectModel(universalOp.get(Tag.class)); } public ValueEncoder getTagEncoder() { return encoder.getValueEncoder(Tag.class); } Object onSuccessFromArticle() { articleOp.saveOrUpdate(article, tags, additionTags); return Articles.class; } /** * Обрабатывает AJAX событие от {@link Autocomplete}. * * @param like начальные буквы тега * @return название найденных тегов по like */ String[] onProvideCompletionsFromAdditionTags(String like) { List found = articleOp.getTagsByLike(like, config.getInt("tag.autocomplete-size")); return found.toArray(new String[found.size()]); } public String getTagDelimeter() { return ITagOperations.TAG_DELIMETER; } public AdminMenu getSelectedMenu() { return article.getId() == null ? AdminMenu.ADD_ARTICLE : AdminMenu.NULL; } }