uk.ac.bbsrc.tgac.miso.core.data.AbstractProject.java Source code

Java tutorial

Introduction

Here is the source code for uk.ac.bbsrc.tgac.miso.core.data.AbstractProject.java

Source

/*
 * Copyright (c) 2012. The Genome Analysis Centre, Norwich, UK
 * MISO project contacts: Robert Davey, Mario Caccamo @ TGAC
 * *********************************************************************
 *
 * This file is part of MISO.
 *
 * MISO 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 3 of the License, or
 * (at your option) any later version.
 *
 * MISO 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 MISO.  If not, see <http://www.gnu.org/licenses/>.
 *
 * *********************************************************************
 */

package uk.ac.bbsrc.tgac.miso.core.data;

import java.util.*;

import javax.persistence.*;

import com.eaglegenomics.simlims.core.Request;
import com.eaglegenomics.simlims.core.SecurityProfile;
import com.eaglegenomics.simlims.core.User;
import org.apache.commons.lang.BooleanUtils;
import org.w3c.dom.Document;
import uk.ac.bbsrc.tgac.miso.core.data.impl.ProjectOverview;
import uk.ac.bbsrc.tgac.miso.core.data.type.ProgressType;
import uk.ac.bbsrc.tgac.miso.core.data.visitor.SubmittableVisitor;
import uk.ac.bbsrc.tgac.miso.core.event.listener.MisoListener;
import uk.ac.bbsrc.tgac.miso.core.event.listener.ProjectListener;
import uk.ac.bbsrc.tgac.miso.core.security.SecurableByProfile;
import uk.ac.bbsrc.tgac.miso.core.util.AliasComparator;

/**
 * Skeleton implementation of a Project
 *
 * @author Rob Davey
 * @since 0.0.2
 */
@Entity
public abstract class AbstractProject implements Project {
    private static final long serialVersionUID = 1L;

    /**
     * Use this ID to indicate that a project has not yet been saved, and
     * therefore does not yet have a unique ID.
     */
    public static final Long UNSAVED_ID = 0L;

    private Date creationDate = new Date();
    private String description = "";
    private String name = "";
    private String alias = "";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long projectId = AbstractProject.UNSAVED_ID;

    @OneToMany(cascade = CascadeType.ALL)
    private Collection<Request> requests = new HashSet<Request>();

    private Collection<Sample> samples = new HashSet<Sample>();
    private Collection<Run> runs = new HashSet<Run>();
    private Collection<Study> studies = new HashSet<Study>();
    private Collection<ProjectOverview> overviews = new HashSet<ProjectOverview>();
    private Collection<String> issueKeys = new HashSet<String>();

    @Enumerated(EnumType.STRING)
    private ProgressType progress;

    @OneToOne(cascade = CascadeType.ALL)
    private SecurityProfile securityProfile = null;
    private Set<MisoListener> listeners = new HashSet<MisoListener>();
    private Date lastUpdated;
    private Set<User> watchers = new HashSet<User>();

    public Date getCreationDate() {
        return creationDate;
    }

    public String getDescription() {
        return description;
    }

    public String getName() {
        return name;
    }

    public String getAlias() {
        return alias;
    }

    @Override
    public long getId() {
        return projectId;
    }

    @Override
    public void setId(long id) {
        this.projectId = id;
    }

    @Deprecated
    public Long getProjectId() {
        return projectId;
    }

    public Collection<Request> getRequests() {
        return requests;
    }

    public Collection<Sample> getSamples() {
        return samples;
    }

    public Collection<Run> getRuns() {
        return runs;
    }

    public Collection<Study> getStudies() {
        return studies;
    }

    public Collection<ProjectOverview> getOverviews() {
        return overviews;
    }

    public ProjectOverview getOverviewById(Long overviewId) {
        for (ProjectOverview p : getOverviews()) {
            if (p.getOverviewId().longValue() == overviewId) {
                return p;
            }
        }
        return null;
    }

    public void setCreationDate(Date date) {
        this.creationDate = date;
    }

    public void setDescription(String description) {
        this.description = description;
    }

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

    public void setAlias(String alias) {
        this.alias = alias;
    }

    @Deprecated
    public void setProjectId(Long projectId) {
        this.projectId = projectId;
    }

    public void setRequests(Collection<Request> requests) {
        this.requests = requests;
    }

    public void setSamples(Collection<Sample> samples) {
        this.samples = samples;
        try {
            Collections.sort(Arrays.asList(this.samples), new AliasComparator(Sample.class));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public void setRuns(Collection<Run> runs) {
        this.runs = runs;
        try {
            Collections.sort(Arrays.asList(this.runs), new AliasComparator(Run.class));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public void addSample(Sample sample) {
        this.samples.add(sample);
        try {
            Collections.sort(Arrays.asList(this.samples), new AliasComparator(Sample.class));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public void setStudies(Collection<Study> studies) {
        this.studies = studies;
        try {
            Collections.sort(Arrays.asList(this.studies), new AliasComparator(Study.class));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public void setOverviews(Collection<ProjectOverview> overviews) {
        this.overviews = overviews;
    }

    public ProgressType getProgress() {
        return progress;
    }

    public void setProgress(ProgressType progress) {
        this.progress = progress;
    }

    public Date getLastUpdated() {
        return lastUpdated;
    }

    public void setLastUpdated(Date lastUpdated) {
        this.lastUpdated = lastUpdated;
    }

    public boolean isDeletable() {
        return getId() != AbstractProject.UNSAVED_ID && getSamples().isEmpty() && getStudies().isEmpty();
    }

    public SecurityProfile getSecurityProfile() {
        return securityProfile;
    }

    public void setSecurityProfile(SecurityProfile profile) {
        this.securityProfile = profile;
    }

    public void inheritPermissions(SecurableByProfile parent) throws SecurityException {
        //projects have no parents
        //setSecurityProfile(parent.getSecurityProfile());
    }

    public boolean userCanRead(User user) {
        try {
            Boolean bool = false;
            if (BooleanUtils.isTrue(securityProfile.userCanRead(user))) {
                bool = true;
            }
            return bool;
        } catch (NullPointerException e) {
            return false;
        }
    }

    public boolean userCanWrite(User user) {
        return securityProfile.userCanWrite(user);
    }

    /**
     * Only those users who can write to the project can create requests on it.
     */
    public Request createRequest(User owner) throws SecurityException {
        if (!userCanWrite(owner)) {
            throw new SecurityException();
        }
        Request request = new Request(this, owner);
        getRequests().add(request);
        return request;
    }

    public void addStudy(Study s) {
        //do study validation
        s.setProject(this);

        //propagate security profiles down the hierarchy
        s.setSecurityProfile(this.securityProfile);

        //add
        this.studies.add(s);
    }

    public Collection<String> getIssueKeys() {
        return issueKeys;
    }

    public void setIssueKeys(Collection<String> issueKeys) {
        this.issueKeys = issueKeys;
    }

    public void addIssueKey(String issueKey) {
        this.issueKeys.add(issueKey);
    }

    public abstract void buildReport();

    @Override
    public Set<MisoListener> getListeners() {
        return this.listeners;
    }

    @Override
    public boolean addListener(MisoListener listener) {
        return listeners.add(listener);
    }

    @Override
    public boolean removeListener(MisoListener listener) {
        return listeners.remove(listener);
    }

    @Override
    public Set<User> getWatchers() {
        return watchers;
    }

    @Override
    public void setWatchers(Set<User> watchers) {
        this.watchers = watchers;
    }

    @Override
    public void addWatcher(User user) {
        watchers.add(user);
    }

    @Override
    public void removeWatcher(User user) {
        watchers.remove(user);
    }

    @Override
    public String getWatchableIdentifier() {
        return getName();
    }

    /**
     * Equivalency is based on getProjectId() if set, otherwise on name,
     * description and creation date.
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof AbstractProject))
            return false;
        AbstractProject them = (AbstractProject) obj;

        if (getId() == AbstractProject.UNSAVED_ID || them.getId() == AbstractProject.UNSAVED_ID) {
            if (getName() != null && them.getName() != null) {
                return getName().equals(them.getName());
            } else {
                return getAlias().equals(them.getAlias());
            }
        } else {
            return this.getId() == them.getId();
        }
    }

    @Override
    public int hashCode() {
        if (getId() != 0L && getId() != AbstractProject.UNSAVED_ID) {
            return (int) getId();
        } else {
            final int PRIME = 37;
            int hashcode = 1;
            if (getName() != null)
                hashcode = PRIME * hashcode + getName().hashCode();
            if (getAlias() != null)
                hashcode = PRIME * hashcode + getAlias().hashCode();
            return hashcode;
        }
    }

    @Override
    public int compareTo(Object o) {
        Project s = (Project) o;
        if (getId() != 0L && s.getId() != 0L) {
            if (getId() < s.getId())
                return -1;
            if (getId() > s.getId())
                return 1;
        } else if (getAlias() != null && s.getAlias() != null) {
            return getAlias().compareTo(s.getAlias());
        }
        return 0;
    }

    /**
     * Format is "Date : Name : Description".
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getId());
        sb.append(" : ");
        sb.append(getCreationDate());
        sb.append(" : ");
        sb.append(getName());
        sb.append(" : ");
        sb.append(getDescription());
        return sb.toString();
    }
}