package marubinotto.piggydb.model; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Set; import marubinotto.piggydb.model.auth.User; import marubinotto.piggydb.model.base.Repository; import marubinotto.piggydb.model.entity.RawTag; import marubinotto.util.Assert; import marubinotto.util.paging.Page; public interface TagRepository extends Repository<Tag> { public Tag newInstance(String name, User user); public Tag getOrCreateTag(String name, User user) throws Exception; public void validate(Tag tag) throws Exception; public boolean containsId(Long id) throws Exception; // By name public Tag getByName(String name) throws Exception; public boolean containsName(String name) throws Exception; public Long getIdByName(String name) throws Exception; public Iterator<String> iterateAllTagNames() throws Exception; public List<String> getNamesLike(String criteria) throws Exception; public Page<Tag> orderByName(int pageSize, int pageIndex) throws Exception; // Tree public Page<Tag> getRootTags(int pageSize, int pageIndex) throws Exception; public Page<Tag> findByParentTag(long parentTagId, int pageSize, int pageIndex) throws Exception; public Set<Long> getAllSubordinateTagIds(Set<Long> tagIds) throws Exception; public Set<Long> selectAllThatHaveChildren(Set<Long> tagIds) throws Exception; // Others public Page<Tag> getRecentChanges(int pageSize, int pageIndex) throws Exception; public Page<Tag> findByKeywords(String keywords, int pageSize, int pageIndex) throws Exception; public List<Tag> getByIds(Collection<Long> tagIds) throws Exception; public List<Tag> getPopularTags(int maxSize) throws Exception; public Tag getTrashTag() throws Exception; public Long countTaggings() throws Exception; public static abstract class Base extends Repository.Base<Tag, RawTag> implements TagRepository { public RawTag newRawEntity() { return new RawTag(); } public Tag newInstance(String name, User user) { Assert.Arg.notNull(user, "user"); return new RawTag(name, user); } public Tag getOrCreateTag(String name, User user) throws Exception { Assert.Arg.notNull(name, "name"); Assert.Arg.notNull(user, "user"); Tag tag = getByName(name); return tag != null ? tag : newInstance(name, user); } public Tag getTrashTag() throws Exception { return getByName(Tag.NAME_TRASH); } @Override protected void doDelete(Tag tag, User user) throws Exception { delete(tag.getId()); } protected abstract void delete(Long id) throws Exception; } }