com.github.jgility.core.project.Project.java Source code

Java tutorial

Introduction

Here is the source code for com.github.jgility.core.project.Project.java

Source

/*
 * 
 * Copyright (c) 2011 by Jgility Development Group
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Karsten Schulz
 *
 */
package com.github.jgility.core.project;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import com.github.jgility.core.planning.IPlan;
import com.github.jgility.core.planning.IRelease;
import com.github.jgility.core.planning.Release;

/**
 * Klasse, welche das Project im Sinne der agilen Softwareentwicklung reprsentiert. Besitzt eine
 * {@link Collection} von {@link Person} als Projektmitglieder, bzw. Bearbeiter und eine
 * {@link Collection} von {@link IPlan} um die Plannungsstruktur abbilden zu knnen.
 * 
 * @author Karsten Schulz <lennylinux.ks@googlemail.com>
 */
@XmlRootElement
@XmlSeeAlso(Release.class)
@XmlAccessorType(XmlAccessType.FIELD)
public class Project {
    private String name;

    private String description;

    private Team team;

    @XmlElementWrapper
    @XmlAnyElement(lax = true)
    private final List<IRelease> releasePlan;

    /**
     * Parameterloser Konstruktor um ein leeres {@link Project} zu instanziieren.<br>
     * Initialisiert Standard-Werte fr Name (<code>Default</code>) und Beschreibung (
     * <code>Default</code>)
     */
    public Project() {
        this("Default", "Default");
    }

    /**
     * Instanziiert ein leeres {@link Project}-Objekt mit Namen und Beschreibung
     * 
     * @param name Name des Projekts
     * @param description Beschreibung des Projekts
     * @throws IllegalArgumentException wenn der Name nicht den Vorgaben entspricht
     * @see #setName(String)
     */
    public Project(String name, String description) throws IllegalArgumentException {
        super();
        setName(name);
        setDescription(description);
        team = new Team(name);
        releasePlan = new ArrayList<>();
    }

    /**
     * Gibt den Namen des {@link Project} zurck
     * 
     * @return der Name des {@link Project}
     */
    public String getName() {
        return name;
    }

    /**
     * Setzt den Namen des {@link Project}
     * 
     * @param Name des {@link Project}
     * @throws IllegalArgumentException wird geworfen, wenn der bergabeparameter leer oder
     *             <code>null</code> ist
     */
    public void setName(String name) throws IllegalArgumentException {
        if (StringUtils.isNotBlank(name)) {
            this.name = name;
        } else {
            throw new IllegalArgumentException("empty name for projects is not allowed");
        }
    }

    /**
     * Gibt die Beschreibung des {@link Project} zurck
     * 
     * @return Beschreibung des {@link Project}
     */
    public String getDescription() {
        return description;
    }

    /**
     * Setzt die Beschreibung des {@link Project}
     * 
     * @param description die Beschreibung des {@link Project}
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * Gibt eine unmodifizierbare {@link List} der Projektbeteiligten zurck
     * 
     * @return {@link List} von {@link Person}
     */
    public Team getTeam() {
        return this.team;
    }

    /**
     * Bestimmt das Team des Projekts. Prft ob das Team nicht <code>null</code> ist und
     * Mitgliederzahl grer als 0
     * 
     * @param team als zu bearbeitenden Projektgruppe
     * @throws IllegalArgumentException wenn der bergabeparameter nicht den Vorgaben entspricht
     */
    public void setTeam(Team team) {
        if (null != team && 0 < team.getMembers().size()) {
            this.team = team;
        } else {
            throw new IllegalArgumentException("empty team is not allowed to set");
        }
    }

    /**
     * Fgt eine {@link List} mit Projektbeteiligten der bestehenden {@link List} hinzu
     * 
     * @param members {@link List} mit allen Projektbeteiligten
     * @throws IllegalArgumentException wird geworfen, wenn eine leere {@link List} mit
     *             {@link Person} bergeben wird
     */
    public void setMembers(List<Person> members) throws IllegalArgumentException {
        if (CollectionUtils.isNotEmpty(members)) {
            for (Person member : members) {
                this.team.addMember(member);
            }
        } else {
            throw new IllegalArgumentException("empty list of person is not allowed to add");
        }
    }

    /**
     * Fgt einen neue {@link Person} der Mitglieder hinzu
     * 
     * @param newMember neue {@link Person} zum Hinzufgen
     * @throws IllegalArgumentException wird geworfen, wenn die neue {@link Person}
     *             <code>null</code> ist
     */
    public void addMember(Person newMember) throws IllegalArgumentException {
        if (ObjectUtils.notEqual(null, newMember)) {
            team.addMember(newMember);
        } else {
            throw new IllegalArgumentException("empty person is not allowed to add");
        }
    }

    /**
     * Entfernt auf Basis des Parameters eine {@link Person} aus der {@link List}
     * 
     * @param removeMember zu entfernende {@link Person}
     * @return <code>true</code> wenn die bergebene {@link Person} erfolgreich aus der Liste
     *         entfernt wurde
     */
    public boolean removeMember(Person removeMember) {
        if (ObjectUtils.notEqual(null, removeMember)) {
            return team.removeMember(removeMember);
        }
        return false;
    }

    /**
     * Entfernt alle Projektbeteiligten aus der {@link List}
     */
    public void clearMembers() {
        team.clearMembers();
    }

    /**
     * Gibt eine {@link List} des Projektplans zurck
     * 
     * @return {@link List} von {@link IRelease}
     */
    public List<IRelease> getReleasePlan() {
        return Collections.unmodifiableList(releasePlan);
    }

    /**
     * Setzt die {@link List} des Projektplans
     * 
     * @param projectPlan {@link List} von {@link IRelease}
     * @throws IllegalArgumentException wird geworfen, wenn die {@link List} von {@link IRelease}
     *             leer oder <code>null</code>
     */
    public void setReleasePlan(List<IRelease> projectPlan) throws IllegalArgumentException {
        if (CollectionUtils.isNotEmpty(projectPlan)) {
            this.releasePlan.addAll(projectPlan);
        } else {
            throw new IllegalArgumentException("empty list of IPlan is not allowed");
        }
    }

    /**
     * Fgt ein neuen {@link IPlan} der {@link List} hinzu
     * 
     * @param newPlan neuer {@link IPlan} zum hinzufgen
     * @throws IllegalArgumentException wird geworfen, wenn der {@link IPlan} den Wert
     *             <code>null</code> beinhaltet
     */
    public void addReleasePlan(IRelease newPlan) throws IllegalArgumentException {
        if (ObjectUtils.notEqual(null, newPlan)) {
            this.releasePlan.add(newPlan);
        } else {
            throw new IllegalArgumentException("empty new IPlan is not allowed");
        }
    }

    /**
     * Entfernt auf Basis des Parameters einen {@link IPlan} aus der {@link List}
     * 
     * @param removePlan zu entfernender {@link IPlan}
     * @return <code>true</code> wenn der bergebende {@link IPlan} erfolgreich aus der {@link List}
     *         entfernt wurde
     */
    public boolean removeReleasePlan(IRelease removePlan) {
        if (ObjectUtils.notEqual(null, removePlan)) {
            return releasePlan.remove(removePlan);
        }
        return false;
    }

    /**
     * Entfernt alle geplanten {@link IPlan}-Referenzen aus dem {@link Project}
     */
    public void clearReleasePlan() {
        releasePlan.clear();
    }

    @Override
    public int hashCode() {
        HashCodeBuilder builder = new HashCodeBuilder();
        builder.append(name);
        builder.append(description);
        builder.append(team);
        builder.append(releasePlan);
        return builder.toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Project) {
            Project project = (Project) obj;
            EqualsBuilder builder = new EqualsBuilder();
            builder.append(name, project.getName());
            builder.append(description, project.getDescription());
            builder.append(team, project.getTeam());
            builder.append(releasePlan, project.getReleasePlan());
            return builder.isEquals();
        }
        return false;
    }

    @Override
    public String toString() {
        return "Project [name=" + name + ", description=" + description + ", members=" + team + ", projectPlan="
                + releasePlan + "]";
    }

}