models.persistence.lecture.Lecture.java Source code

Java tutorial

Introduction

Here is the source code for models.persistence.lecture.Lecture.java

Source

/*
 * GNU GENERAL PUBLIC LICENSE
 *                        Version 2, June 1991
 *
 *  Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 *  Everyone is permitted to copy and distribute verbatim copies
 *  of this license document, but changing it is not allowed.
 *
 *                             Preamble
 *
 *   The licenses for most software are designed to take away your
 * freedom to share and change it.  By contrast, the GNU General Public
 * License is intended to guarantee your freedom to share and change free
 * software--to make sure the software is free for all its users.  This
 * General Public License applies to most of the Free Software
 * Foundation's software and to any other program whose authors commit to
 * using it.  (Some other Free Software Foundation software is covered by
 * the GNU Lesser General Public License instead.)  You can apply it to
 * your programs, too.
 *
 *   When we speak of free software, we are referring to freedom, not
 * price.  Our General Public Licenses are designed to make sure that you
 * have the freedom to distribute copies of free software (and charge for
 * this service if you wish), that you receive source code or can get it
 * if you want it, that you can change the software or use pieces of it
 * in new free programs; and that you know you can do these things.
 *
 *   To protect your rights, we need to make restrictions that forbid
 * anyone to deny you these rights or to ask you to surrender the rights.
 * These restrictions translate to certain responsibilities for you if you
 * distribute copies of the software, or if you modify it.
 *
 *   For example, if you distribute copies of such a program, whether
 * gratis or for a fee, you must give the recipients all the rights that
 * you have.  You must make sure that they, too, receive or can get the
 * source code.  And you must show them these terms so they know their
 * rights.
 *
 *   We protect your rights with two steps: (1) copyright the software, and
 * (2) offer you this license which gives you legal permission to copy,
 * distribute and/or modify the software.
 *
 *   Also, for each author's protection and ours, we want to make certain
 * that everyone understands that there is no warranty for this free
 * software.  If the software is modified by someone else and passed on, we
 * want its recipients to know that what they have is not the original, so
 * that any problems introduced by others will not reflect on the original
 * authors' reputations.
 *
 *   Finally, any free program is threatened constantly by software
 * patents.  We wish to avoid the danger that redistributors of a free
 * program will individually obtain patent licenses, in effect making the
 * program proprietary.  To prevent this, we have made it clear that any
 * patent must be licensed for everyone's free use or not licensed at all.
 *
 *   The precise terms and conditions for copying, distribution and
 * modification follow.
 *
 *                     GNU GENERAL PUBLIC LICENSE
 *    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 *
 *   0. This License applies to any program or other work which contains
 * a notice placed by the copyright holder saying it may be distributed
 * under the terms of this General Public License.  The "Program", below,
 * refers to any such program or work, and a "work based on the Program"
 * means either the Program or any derivative work under copyright law:
 * that is to say, a work containing the Program or a portion of it,
 * either verbatim or with modifications and/or translated into another
 * language.  (Hereinafter, translation is included without limitation in
 * the term "modification".)  Each licensee is addressed as "you".
 *
 * Activities other than copying, distribution and modification are not
 * covered by this License; they are outside its scope.  The act of
 * running the Program is not restricted, and the output from the Program
 * is covered only if its contents constitute a work based on the
 * Program (independent of having been made by running the Program).
 * Whether that is true depends on what the Program does.
 *
 *   1. You may copy and distribute verbatim copies of the Program's
 * source code as you receive it, in any medium, provided that you
 * conspicuously and appropriately publish on each copy an appropriate
 * copyright notice and disclaimer of warranty; keep intact all the
 * notices that refer to this License and to the absence of any warranty;
 * and give any other recipients of the Program a copy of this License
 * along with the Program.
 *
 * You may charge a fee for the physical act of transferring a copy, and
 * you may at your option offer warranty protection in exchange for a fee.
 *
 *   2. You may modify your copy or copies of the Program or any portion
 * of it, thus forming a work based on the Program, and copy and
 * distribute such modifications or work under the terms of Section 1
 * above, provided that you also meet all of these conditions:
 *
 *     a) You must cause the modified files to carry prominent notices
 *     stating that you changed the files and the date of any change.
 *
 *     b) You must cause any work that you distribute or publish, that in
 *     whole or in part contains or is derived from the Program or any
 *     part thereof, to be licensed as a whole at no charge to all third
 *     parties under the terms of this License.
 *
 *     c) If the modified program normally reads commands interactively
 *     when run, you must cause it, when started running for such
 *     interactive use in the most ordinary way, to print or display an
 *     announcement including an appropriate copyright notice and a
 *     notice that there is no warranty (or else, saying that you provide
 *     a warranty) and that users may redistribute the program under
 *     these conditions, and telling the user how to view a copy of this
 *     License.  (Exception: if the Program itself is interactive but
 *     does not normally print such an announcement, your work based on
 *     the Program is not required to print an announcement.)
 *
 * These requirements apply to the modified work as a whole.  If
 * identifiable sections of that work are not derived from the Program,
 * and can be reasonably considered independent and separate works in
 * themselves, then this License, and its terms, do not apply to those
 * sections when you distribute them as separate works.  But when you
 * distribute the same sections as part of a whole which is a work based
 * on the Program, the distribution of the whole must be on the terms of
 * this License, whose permissions for other licensees extend to the
 * entire whole, and thus to each and every part regardless of who wrote it.
 *
 * Thus, it is not the intent of this section to claim rights or contest
 * your rights to work written entirely by you; rather, the intent is to
 * exercise the right to control the distribution of derivative or
 * collective works based on the Program.
 *
 * In addition, mere aggregation of another work not based on the Program
 * with the Program (or with a work based on the Program) on a volume of
 * a storage or distribution medium does not bring the other work under
 * the scope of this License.
 *
 *   3. You may copy and distribute the Program (or a work based on it,
 * under Section 2) in object code or executable form under the terms of
 * Sections 1 and 2 above provided that you also do one of the following:
 *
 *     a) Accompany it with the complete corresponding machine-readable
 *     source code, which must be distributed under the terms of Sections
 *     1 and 2 above on a medium customarily used for software interchange; or,
 *
 *     b) Accompany it with a written offer, valid for at least three
 *     years, to give any third party, for a charge no more than your
 *     cost of physically performing source distribution, a complete
 *     machine-readable copy of the corresponding source code, to be
 *     distributed under the terms of Sections 1 and 2 above on a medium
 *     customarily used for software interchange; or,
 *
 *     c) Accompany it with the information you received as to the offer
 *     to distribute corresponding source code.  (This alternative is
 *     allowed only for noncommercial distribution and only if you
 *     received the program in object code or executable form with such
 *     an offer, in accord with Subsection b above.)
 *
 * The source code for a work means the preferred form of the work for
 * making modifications to it.  For an executable work, complete source
 * code means all the source code for all modules it contains, plus any
 * associated interface definition files, plus the scripts used to
 * control compilation and installation of the executable.  However, as a
 * special exception, the source code distributed need not include
 * anything that is normally distributed (in either source or binary
 * form) with the major components (compiler, kernel, and so on) of the
 * operating system on which the executable runs, unless that component
 * itself accompanies the executable.
 *
 * If distribution of executable or object code is made by offering
 * access to copy from a designated place, then offering equivalent
 * access to copy the source code from the same place counts as
 * distribution of the source code, even though third parties are not
 * compelled to copy the source along with the object code.
 *
 *   4. You may not copy, modify, sublicense, or distribute the Program
 * except as expressly provided under this License.  Any attempt
 * otherwise to copy, modify, sublicense or distribute the Program is
 * void, and will automatically terminate your rights under this License.
 * However, parties who have received copies, or rights, from you under
 * this License will not have their licenses terminated so long as such
 * parties remain in full compliance.
 *
 *   5. You are not required to accept this License, since you have not
 * signed it.  However, nothing else grants you permission to modify or
 * distribute the Program or its derivative works.  These actions are
 * prohibited by law if you do not accept this License.  Therefore, by
 * modifying or distributing the Program (or any work based on the
 * Program), you indicate your acceptance of this License to do so, and
 * all its terms and conditions for copying, distributing or modifying
 * the Program or works based on it.
 *
 *   6. Each time you redistribute the Program (or any work based on the
 * Program), the recipient automatically receives a license from the
 * original licensor to copy, distribute or modify the Program subject to
 * these terms and conditions.  You may not impose any further
 * restrictions on the recipients' exercise of the rights granted herein.
 * You are not responsible for enforcing compliance by third parties to
 * this License.
 *
 *   7. If, as a consequence of a court judgment or allegation of patent
 * infringement or for any other reason (not limited to patent issues),
 * conditions are imposed on you (whether by court order, agreement or
 * otherwise) that contradict the conditions of this License, they do not
 * excuse you from the conditions of this License.  If you cannot
 * distribute so as to satisfy simultaneously your obligations under this
 * License and any other pertinent obligations, then as a consequence you
 * may not distribute the Program at all.  For example, if a patent
 * license would not permit royalty-free redistribution of the Program by
 * all those who receive copies directly or indirectly through you, then
 * the only way you could satisfy both it and this License would be to
 * refrain entirely from distribution of the Program.
 *
 * If any portion of this section is held invalid or unenforceable under
 * any particular circumstance, the balance of the section is intended to
 * apply and the section as a whole is intended to apply in other
 * circumstances.
 *
 * It is not the purpose of this section to induce you to infringe any
 * patents or other property right claims or to contest validity of any
 * such claims; this section has the sole purpose of protecting the
 * integrity of the free software distribution system, which is
 * implemented by public license practices.  Many people have made
 * generous contributions to the wide range of software distributed
 * through that system in reliance on consistent application of that
 * system; it is up to the author/donor to decide if he or she is willing
 * to distribute software through any other system and a licensee cannot
 * impose that choice.
 *
 * This section is intended to make thoroughly clear what is believed to
 * be a consequence of the rest of this License.
 *
 *   8. If the distribution and/or use of the Program is restricted in
 * certain countries either by patents or by copyrighted interfaces, the
 * original copyright holder who places the Program under this License
 * may add an explicit geographical distribution limitation excluding
 * those countries, so that distribution is permitted only in or among
 * countries not thus excluded.  In such case, this License incorporates
 * the limitation as if written in the body of this License.
 *
 *   9. The Free Software Foundation may publish revised and/or new versions
 * of the General Public License from time to time.  Such new versions will
 * be similar in spirit to the present version, but may differ in detail to
 * address new problems or concerns.
 *
 * Each version is given a distinguishing version number.  If the Program
 * specifies a version number of this License which applies to it and "any
 * later version", you have the option of following the terms and conditions
 * either of that version or of any later version published by the Free
 * Software Foundation.  If the Program does not specify a version number of
 * this License, you may choose any version ever published by the Free Software
 * Foundation.
 *
 *   10. If you wish to incorporate parts of the Program into other free
 * programs whose distribution conditions are different, write to the author
 * to ask for permission.  For software which is copyrighted by the Free
 * Software Foundation, write to the Free Software Foundation; we sometimes
 * make exceptions for this.  Our decision will be guided by the two goals
 * of preserving the free status of all derivatives of our free software and
 * of promoting the sharing and reuse of software generally.
 *
 *                             NO WARRANTY
 *
 *   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 * FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
 * OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 * PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
 * OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
 * TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
 * PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 * REPAIR OR CORRECTION.
 *
 *   12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 * WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 * REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 * INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
 * OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
 * TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
 * YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 * PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 *                      END OF TERMS AND CONDITIONS
 *
 *             How to Apply These Terms to Your New Programs
 *
 *   If you develop a new program, and you want it to be of the greatest
 * possible use to the public, the best way to achieve this is to make it
 * free software which everyone can redistribute and change under these terms.
 *
 *   To do so, attach the following notices to the program.  It is safest
 * to attach them to the start of each source file to most effectively
 * convey the exclusion of warranty; and each file should have at least
 * the "copyright" line and a pointer to where the full notice is found.
 *
 *     {description}
 *     Copyright (C) {year}  {fullname}
 *
 *     This program 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 2 of the License, or
 *     (at your option) any later version.
 *
 *     This program 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 this program; if not, write to the Free Software Foundation, Inc.,
 *     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Also add information on how to contact you by electronic and paper mail.
 *
 * If the program is interactive, make it output a short notice like this
 * when it starts in an interactive mode:
 *
 *     Gnomovision version 69, Copyright (C) year name of author
 *     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
 *     This is free software, and you are welcome to redistribute it
 *     under certain conditions; type `show c' for details.
 *
 * The hypothetical commands `show w' and `show c' should show the appropriate
 * parts of the General Public License.  Of course, the commands you use may
 * be called something other than `show w' and `show c'; they could even be
 * mouse-clicks or menu items--whatever suits your program.
 *
 * You should also get your employer (if you work as a programmer) or your
 * school, if any, to sign a "copyright disclaimer" for the program, if
 * necessary.  Here is a sample; alter the names:
 *
 *   Yoyodyne, Inc., hereby disclaims all copyright interest in the program
 *   `Gnomovision' (which makes passes at compilers) written by James Hacker.
 *
 *   {signature of Ty Coon}, 1 April 1989
 *   Ty Coon, President of Vice
 *
 * This General Public License does not permit incorporating your program into
 * proprietary programs.  If your program is a subroutine library, you may
 * consider it more useful to permit linking proprietary applications with the
 * library.  If this is what you want to do, use the GNU Lesser General
 * Public License instead of this License.
 */

package models.persistence.lecture;

import com.fasterxml.jackson.annotation.JsonIgnore;
import models.persistence.criteria.CriteriaContainer;
import models.persistence.docents.LectureDocent;
import models.persistence.enumerations.EDuration;
import models.persistence.enumerations.ELectureKind;
import models.persistence.location.LectureRoom;
import models.persistence.location.RoomEntity;
import models.persistence.participants.LectureParticipant;
import models.persistence.participants.Participant;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import javax.persistence.*;
import java.math.BigInteger;
import java.util.*;

/**
 * @author fabian
 *         on 28.01.14.
 */
@Entity
@Table(name = "TBLLECTURE")
public class Lecture extends AbstractLecture {

    /** individual id of every lecture */
    @Column(name = "UUID")
    private String uuid = UUID.randomUUID().toString();

    /**
     * name of the lecture
     */
    @Column(name = "NAME", nullable = false)
    private String name;

    /**
     * participants can be multiple courses or groups
     */
    @Transient
    private Set<Participant> participants;

    /**
     * docents for this lecture
     */
    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "TBLLECTURE_DOCENTS")
    private Set<LectureDocent> docents;
    /**
     * room for this lecture
     */
    @Transient
    private RoomEntity room;

    /** Lecture room is needed to avoid dependency wo roomentity in database */
    private LectureRoom lectureRoom;

    /**
     * duration of this lecture
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "DURATION", nullable = false)
    private EDuration duration;

    /**
     * criterias of this lecture
     */
    @Transient
    private CriteriaContainer criteriaContainer;

    /**
     * same subject can have diffrent names in diffrent courses
     */
    @ElementCollection(fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    @MapKeyColumn(name = "COURSE")
    @Column(name = "LECTURENAME")
    @CollectionTable(name = "TBLLECTURE_SYNONYMS")
    private Map<String, String> lectureSynonyms;

    /**
     * shortcut for the Lecture
     */
    @ElementCollection(fetch = FetchType.EAGER)
    @Fetch(FetchMode.SUBSELECT)
    @MapKeyColumn(name = "COURSE")
    @Column(name = "SHORTCUT")
    @CollectionTable(name = "TBLLECTURE_TBLSHORTCUT")
    private Map<String, String> shortCuts;

    /**
     * kind of this lecture
     */
    @Enumerated(EnumType.ORDINAL)
    @Column(name = "KIND")
    private ELectureKind kind;

    /**
     * number of exprected participants
     */
    @Column(name = "EXPECTED_PARTICIPANTS")
    private Integer expectedParticipants;

    @Transient
    @JsonIgnore
    private BigInteger difficultLevel = BigInteger.ZERO;

    @CollectionTable(name = "TBLLECTURE_PARTICIPANTS")
    @ElementCollection(fetch = FetchType.EAGER)
    private Set<LectureParticipant> lectureParticipants;

    /**
     * alternative rooms of this lecture
     */
    @Transient
    private List<RoomEntity> alternativeRooms;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "TBLLECTURE_ALTERNATIVE_ROOMS")
    private Set<LectureRoom> alternativeLectureRooms;

    /**
     * this is just for debugging
     * <p>
     * by setting 'schedule.show.outOfWishTime=on' it will be honored by the schedule presentation
     * </p>
     */
    @Transient
    private String notOptimalPlaced = "";

    public Map<String, String> getShortCuts() {
        return shortCuts;
    }

    public void setShortCuts(Map<String, String> shortCuts) {
        this.shortCuts = shortCuts;
    }

    public List<RoomEntity> getAlternativeRooms() {
        return alternativeRooms;
    }

    public void setAlternativeRooms(List<RoomEntity> alternativeRooms) {
        this.alternativeRooms = alternativeRooms;
    }

    public Set<LectureRoom> getAlternativeLectureRooms() {
        return alternativeLectureRooms;
    }

    public void setAlternativeLectureRooms(Set<LectureRoom> alternativeLectureRooms) {
        this.alternativeLectureRooms = alternativeLectureRooms;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public Set<LectureParticipant> getLectureParticipants() {
        return lectureParticipants;
    }

    public void setLectureParticipants(Set<LectureParticipant> lectureParticipants) {
        this.lectureParticipants = lectureParticipants;
    }

    public String getNotOptimalPlaced() {
        return notOptimalPlaced;
    }

    public void setNotOptimalPlaced(String notOptimalPlaced) {
        this.notOptimalPlaced = notOptimalPlaced;
    }

    public void setDifficultLevel(BigInteger difficultLevel) {
        this.difficultLevel = difficultLevel;
    }

    public void increaseDifficultLevel() {
        difficultLevel = difficultLevel.add(getDifficulty());
    }

    /**
     * if expected participants is set it will return it
     * else it will sum the size of all participants
     */
    public Integer calculateNumberOfParticipants() {
        if (expectedParticipants != null && expectedParticipants > 0) {
            return expectedParticipants;
        }

        /** it is expected, that 10% of the participants will not visit this lecture */
        int ret = participants.stream().mapToInt(Participant::getSize).sum();
        ret -= Math.ceil(((double) ret) * 10.0 / 100.0);
        return ret;
    }

    /**
     * calculate cost of this lecture
     * the more costs a lecture have it will be more important to place it first
     */
    @JsonIgnore
    public BigInteger getDifficulty() {
        BigInteger ret = BigInteger.ZERO;

        if (criteriaContainer != null) {
            ret = ret.add(BigInteger.valueOf(criteriaContainer.calculateDifficultLevel()));
        }

        if (docents != null) {
            ret = ret.add(BigInteger.valueOf(docents.parallelStream()
                    .mapToLong(d -> d.getCriteriaContainer().calculateDifficultLevel()).sum()));
        }

        if (participants != null) {
            ret = ret.add(BigInteger.valueOf(participants.size()));
        }

        ret = ret.add(BigInteger.valueOf(calculateNumberOfParticipants()));

        ret = ret.add(difficultLevel);

        ret = ret.add(BigInteger.valueOf(duration.getSortIndex()));

        return ret;
    }

    public Integer getExpectedParticipants() {
        return expectedParticipants;
    }

    public void setExpectedParticipants(Integer expectedParticipants) {
        this.expectedParticipants = expectedParticipants;
    }

    public ELectureKind getKind() {
        return kind;
    }

    public void setKind(ELectureKind kind) {
        this.kind = kind;
    }

    public Map<String, String> getLectureSynonyms() {
        return lectureSynonyms;
    }

    public void setLectureSynonyms(Map<String, String> lectureSynonyms) {
        this.lectureSynonyms = lectureSynonyms;
    }

    public CriteriaContainer getCriteriaContainer() {
        return criteriaContainer;
    }

    public void setCriteriaContainer(CriteriaContainer criteriaContainer) {
        this.criteriaContainer = criteriaContainer;
    }

    public RoomEntity getRoom() {
        return room;
    }

    public void setRoom(RoomEntity room) {
        this.room = room;
    }

    @Override
    public EDuration getDuration() {
        return duration;
    }

    public void setDuration(EDuration duration) {
        this.duration = duration;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Participant> getParticipants() {
        return participants;
    }

    public void setParticipants(Set<Participant> participants) {
        this.participants = participants;
    }

    public Set<LectureDocent> getDocents() {
        return docents;
    }

    public void setDocents(Set<LectureDocent> docent) {
        this.docents = docent;
    }

    public LectureRoom getLectureRoom() {
        return lectureRoom;
    }

    public void setLectureRoom(LectureRoom lectureRoom) {
        this.lectureRoom = lectureRoom;
    }

    @Override
    public Set<LectureRoom> getRooms() {
        return new HashSet<LectureRoom>() {
            {
                add(lectureRoom);
                addAll(alternativeLectureRooms);
            }
        };
    }

    @Override
    public Set<RoomEntity> getRoomEntitys() {
        return new HashSet<RoomEntity>() {
            {
                add(room);
                addAll(alternativeRooms);
            }
        };
    }

    public String getShortName(String courseName) {

        String shortName = shortCuts.get(courseName);

        if (shortName == null || shortName.isEmpty()) {
            shortName = shortCuts.getOrDefault("*", getShortName());
            shortName = shortName.isEmpty() ? getShortName() : shortName;
        }

        return shortName;
    }

    @JsonIgnore
    public String getShortName() {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < name.length(); i++) {
            if (Character.isUpperCase(name.charAt(i)) || Character.isDigit(name.charAt(i)) || name.charAt(i) == '/'
                    || name.charAt(i) == ' ' || name.charAt(i) == '+' || name.charAt(i) == '-') {
                sb.append(name.charAt(i));

                if (Character.isUpperCase(name.charAt(i))) {
                    for (int j = i; j < i + 3 && j < name.length(); j++) {
                        if (Character.isLowerCase(name.charAt(j))) {
                            sb.append(name.charAt(j));
                        }
                    }
                }
            }
        }

        return sb.toString().replaceAll("  ", "").replaceAll("AE", "").replaceAll("OE", "")
                .replaceAll("UE", "").trim();
        //return sb.toString().replaceAll("","AE").replaceAll("","OE").replaceAll("","UE").trim();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;

        Lecture lecture = (Lecture) o;

        if (!uuid.equals(lecture.uuid))
            return false;

        return true;
    }

    @Override
    public int hashCode() {
        return uuid.hashCode();
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Lecture{");
        sb.append("name='").append(name).append('\'');
        sb.append(", kind=").append(kind);
        sb.append(", expectedParticipants=").append(expectedParticipants);
        sb.append(", participants=").append(participants);
        sb.append(", docents=").append(docents);
        sb.append(", room=").append(lectureRoom);
        sb.append(", duration=").append(duration);
        sb.append('}');
        return sb.toString();
    }

}