Java tutorial
/** * Copyright 2002 Instituto Superior Tcnico * * This file is part of FenixEdu Core. * * FenixEdu Core is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Core 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Core. If not, see <http://www.gnu.org/licenses/>. */ package net.sourceforge.fenixedu.domain.messaging; import java.text.Collator; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.TreeSet; import net.sourceforge.fenixedu.domain.FileContent; import net.sourceforge.fenixedu.domain.Person; import net.sourceforge.fenixedu.domain.Site; import net.sourceforge.fenixedu.domain.exceptions.DomainException; import net.sourceforge.fenixedu.injectionCode.AccessControl; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.Predicate; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.domain.User; import org.fenixedu.bennu.core.groups.Group; import org.fenixedu.bennu.core.security.Authenticate; import org.joda.time.DateTime; import org.joda.time.YearMonthDay; import pt.ist.fenixframework.Atomic; import pt.utl.ist.fenix.tools.util.i18n.MultiLanguageString; import com.google.common.collect.Ordering; public abstract class AnnouncementBoard extends AnnouncementBoard_Base { public static class AnnouncementPresentationBean extends TreeSet<Announcement> { private int maxElements = 0; private final Comparator<Announcement> comparator; public AnnouncementPresentationBean(final int maxElements, final Comparator<Announcement> comparator) { super(comparator); this.maxElements = maxElements; this.comparator = comparator; } @Override public boolean add(Announcement announcement) { if (size() < maxElements) { return super.add(announcement); } final Announcement oldestAnnouncement = last(); if (comparator.compare(announcement, oldestAnnouncement) < 0) { remove(oldestAnnouncement); return super.add(announcement); } return false; } @Override public boolean addAll(Collection<? extends Announcement> c) { for (final Announcement announcement : c) { add(announcement); } return true; } } public static final Comparator<AnnouncementBoard> NEWEST_FIRST = new Comparator<AnnouncementBoard>() { @Override public int compare(AnnouncementBoard o1, AnnouncementBoard o2) { int result = -o1.getCreationDate().compareTo(o2.getCreationDate()); return (result == 0) ? o1.getExternalId().compareTo(o2.getExternalId()) : result; } }; public static final Comparator<AnnouncementBoard> BY_NAME = new Comparator<AnnouncementBoard>() { @Override public int compare(AnnouncementBoard o1, AnnouncementBoard o2) { int result = Collator.getInstance().compare(o1.getName().getContent(), o2.getName().getContent()); return (result == 0) ? o1.getExternalId().compareTo(o2.getExternalId()) : result; } }; public static class AcessLevelPredicate implements Predicate { AnnouncementBoardAccessLevel level; User user; public AcessLevelPredicate(AnnouncementBoardAccessLevel level, User user) { this.level = level; this.user = user; } @Override public boolean evaluate(Object arg0) { final AnnouncementBoard board = (AnnouncementBoard) arg0; boolean result = false; switch (level) { case ABAL_ALL: if (board.getManagers() == null || board.getWriters() == null || board.getReaders() == null || board.getManagers().isMember(user) || board.getWriters().isMember(user) || board.getReaders().isMember(user)) { result = true; } break; case ABAL_MANAGE: if (board.getManagers() == null || board.getManagers().isMember(user)) { result = true; } break; case ABAL_READ: if (board.getReaders() == null || board.getReaders().isMember(user)) { result = true; } break; case ABAL_WRITE: if (board.getWriters() == null || board.getWriters().isMember(user)) { result = true; } break; } return result; } } public static class AcessTypePredicate implements Predicate { AnnouncementBoardAccessType type; Person person; public AcessTypePredicate(AnnouncementBoardAccessType type, Person person) { this.type = type; this.person = person; } @Override public boolean evaluate(Object arg0) { final AnnouncementBoard board = (AnnouncementBoard) arg0; switch (type) { case ABAT_PUBLIC: return board.isPublicToRead(); case ABAT_PRIVATE: return (board.getReaders() != null); case ABAT_ALL: return true; default: return false; } } } public AnnouncementBoard() { super(); setBennu(Bennu.getInstance()); setCreationDate(new DateTime()); } public List<Announcement> getActiveAnnouncements() { final List<Announcement> activeAnnouncements = new ArrayList<Announcement>(); for (Announcement announcement : getAnnouncementSet()) { if (announcement.isActive() && announcement.getVisible() && announcement.getApproved()) { activeAnnouncements.add(announcement); } } return activeAnnouncements; } public List<Announcement> getApprovedAnnouncements() { final User user = Authenticate.getUser(); final List<Announcement> activeAnnouncements = new ArrayList<Announcement>(); for (Announcement announcement : getAnnouncementSet()) { Group approvers = announcement.getAnnouncementBoard().getApprovers(); Person creator = announcement.getCreator(); if (announcement.isActive() && announcement.getVisible() && (announcement.getApproved() || (user != null && ((creator != null && creator.equals(user.getPerson())) || (approvers != null && approvers.isMember(user)))))) { activeAnnouncements.add(announcement); } } return activeAnnouncements; } public int getActiveAnnoucementsCount() { return getActiveAnnouncements().size(); } public Collection<Announcement> getVisibleAnnouncements() { final Collection<Announcement> activeAnnouncements = new ArrayList<Announcement>(); for (Announcement announcement : getAnnouncementSet()) { if (announcement.getVisible()) { activeAnnouncements.add(announcement); } } return activeAnnouncements; } public void addVisibleAnnouncements(final AnnouncementPresentationBean announcementPresentationBean) { for (final Announcement announcement : getAnnouncementSet()) { if (announcement.getVisible() && announcement.isInPublicationPeriod()) { announcementPresentationBean.add(announcement); } } } public boolean isDeletable() { return getAnnouncementSet().isEmpty(); } public void delete() { if (!isDeletable()) { throw new DomainException("cannot.delete.non.empty.announcement.board"); } for (FileContent content : getFileContentSet()) { content.delete(); } setManagersGroup(null); setReadersGroup(null); setApproversGroup(null); setWritersGroup(null); setBennu(null); removeBookmarkedBoards(); deleteDomainObject(); } private void removeBookmarkedBoards() { for (final Person person : this.getBookmarkOwnerSet()) { removeBookmarkOwner(person); } } public Group getManagers() { return getManagersGroup() != null ? getManagersGroup().toGroup() : null; } public void setManagers(Group managers) { setManagersGroup(managers.toPersistentGroup()); } public Group getReaders() { return getReadersGroup() != null ? getReadersGroup().toGroup() : null; } public void setReaders(Group readers) { setReadersGroup(readers.toPersistentGroup()); } public Group getWriters() { return getWritersGroup() != null ? getWritersGroup().toGroup() : null; } public void setWriters(Group writers) { setWritersGroup(writers.toPersistentGroup()); } public Group getApprovers() { return getApproversGroup() != null ? getApproversGroup().toGroup() : null; } public void setApprovers(Group approvers) { setApproversGroup(approvers.toPersistentGroup()); } public boolean isPublicToRead() { return getReaders() == null; } public boolean isPublicToWrite() { return getWriters() == null; } public boolean isPublicToManage() { return getManagers() == null; } public boolean isPublicToApprove() { return getApprovers() == null; } public boolean hasReader(Person person) { return (isPublicToRead() || (person != null && getReaders().isMember(person.getUser()))); } public boolean isCurrentUserReader() { return hasReader(AccessControl.getPerson()); } public boolean hasWriter(Person person) { return (isPublicToWrite() || (person != null && getWriters().isMember(person.getUser()))); } public boolean isCurrentUserWriter() { return hasWriter(AccessControl.getPerson()); } public boolean isCurrentUserApprover() { return hasApprover(AccessControl.getPerson()); } public boolean hasApprover(Person person) { return (isPublicToApprove() || (person != null && getApprovers() != null && getApprovers().isMember(person.getUser()))); } public boolean hasManager(Person person) { return (isPublicToManage() || getManagers().isMember(person.getUser())); } public boolean isCurrentUserManager() { return hasManager(AccessControl.getPerson()); } public boolean hasReaderOrWriter(Person person) { return hasReader(person) || hasWriter(person); } public boolean isCurrentUserReaderOrWriter() { return hasReaderOrWriter(AccessControl.getPerson()); } abstract public String getFullName(); abstract public String getQualifiedName(); protected boolean isGroupMember(final Group group) { return group == null || group.isMember(Authenticate.getUser()); } public boolean isReader() { return isGroupMember(getReaders()); } public boolean isWriter() { return isGroupMember(getWriters()); } public boolean isManager() { return isGroupMember(getManagers()); } public boolean isApprover() { return isGroupMember(getApprovers()); } public boolean isBookmarkOwner() { return AccessControl.getPerson().getBookmarkedBoardsSet().contains(this); } private List<Announcement> filterAnnouncements(Collection<Announcement> announcements, final Predicate predicate) { return (List<Announcement>) CollectionUtils.select(announcements, new Predicate() { @Override public boolean evaluate(Object arg0) { Announcement announcement = (Announcement) arg0; return announcement.getApproved() && predicate.evaluate(arg0); } }); } public List<Announcement> getActiveAnnouncementsFor(final YearMonthDay date) { return filterAnnouncements(getAnnouncementSet(), new Predicate() { @Override public boolean evaluate(Object arg0) { Announcement announcement = (Announcement) arg0; DateTime announcementDate = announcement.getReferedSubjectBegin(); DateTime finalAnnouncementDate = announcement.getReferedSubjectEnd(); return announcement.isActive() && announcement.getVisible() && announcementDate != null && (announcementDate.toYearMonthDay().equals(date) || (announcementDate.toYearMonthDay().isBefore(date) && finalAnnouncementDate != null && finalAnnouncementDate.toYearMonthDay().isAfter(date))); } }); } public List<Announcement> getActiveAnnouncementsUntil(final YearMonthDay date) { return filterAnnouncements(getAnnouncementSet(), new Predicate() { @Override public boolean evaluate(Object arg0) { Announcement announcement = (Announcement) arg0; DateTime announcementDate = announcement.getReferedSubjectBegin(); return announcement.isActive() && announcement.getVisible() && announcementDate != null && announcementDate.toYearMonthDay().isBefore(date); } }); } public List<Announcement> getActiveAnnouncementsAfter(final YearMonthDay date) { return filterAnnouncements(getAnnouncementSet(), new Predicate() { @Override public boolean evaluate(Object arg0) { Announcement announcement = (Announcement) arg0; DateTime announcementDate = announcement.getReferedSubjectBegin(); return announcement.isActive() && announcement.getVisible() && announcementDate != null && announcementDate.toYearMonthDay().isAfter(date); } }); } public List<Announcement> getActiveAnnouncementsBefore(final YearMonthDay date) { return filterAnnouncements(getAnnouncementSet(), new Predicate() { @Override public boolean evaluate(Object arg0) { Announcement announcement = (Announcement) arg0; DateTime announcementDate = announcement.getReferedSubjectBegin(); DateTime endDate = announcement.getReferedSubjectEnd(); return announcement.isActive() && announcement.getVisible() && announcementDate != null && announcementDate.toYearMonthDay().isBefore(date) && (endDate == null || endDate.toYearMonthDay().isBefore(date)); } }); } @Override public void addFileContent(FileContent fileContent) { logAddFile(fileContent); super.addFileContent(fileContent); } public List<FileContent> getFilesSortedByDate() { List<FileContent> files = new ArrayList<>(getFileContentSet()); Collections.sort(files, Ordering.from(new Comparator<FileContent>() { @Override public int compare(FileContent f1, FileContent f2) { return f1.getUploadTime().compareTo(f2.getUploadTime()); } }).reverse()); return files; } public String getKeywords() { StringBuilder keywords = new StringBuilder(); for (Announcement announcement : getAnnouncementSet()) { MultiLanguageString announcementKeyword = announcement.getKeywords(); if (announcementKeyword != null) { if (keywords.length() > 0) { keywords.append(", "); } keywords.append(announcementKeyword.getContent()); } } return keywords.toString(); } public Boolean getInitialAnnouncementsApprovedState() { return false; } public String getSiteParamForAnnouncementBoard(Announcement announcement) { StringBuffer actionPath = new StringBuffer(); actionPath.append("&announcementId="); actionPath.append(announcement.getExternalId()); return actionPath.toString(); } @Atomic public FileContent addFileToBoard(String fileName, byte[] content, String creatorName) { return new PublicBoardFileContent(fileName, content, creatorName, this); } public void logCreate(Announcement announcement) { } public void logEdit(Announcement announcement) { } public void logRemove(Announcement announcement) { } public void logAddFile(FileContent attachment) { } public abstract Site getSite(); }