/*
* Copyright 2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sagan.projects;
import org.springframework.util.StringUtils;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@Entity
public class Project {
@Id
private String id;
private String name;
private String repoUrl;
private String siteUrl;
private String category;
@ElementCollection
private List<ProjectRelease> releaseList = new ArrayList<>();
private boolean isAggregator;
private String stackOverflowTags;
@SuppressWarnings("unused")
private Project() {
}
public Project(String id, String name, String repoUrl, String siteUrl, List<ProjectRelease> releaseList,
boolean isAggregator, String category) {
this.id = id;
this.name = name;
this.repoUrl = repoUrl;
this.siteUrl = siteUrl;
this.releaseList = releaseList;
this.isAggregator = isAggregator;
this.category = category;
}
public Project(String id, String name, String repoUrl, String siteUrl, List<ProjectRelease> releaseList,
boolean isAggregator, String category, String stackOverflowTags) {
this(id, name, repoUrl, siteUrl, releaseList, isAggregator, category);
this.setStackOverflowTags(stackOverflowTags);
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public void setProjectReleases(List<ProjectRelease> releases) {
this.releaseList = releases;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setRepoUrl(String repoUrl) {
this.repoUrl = repoUrl;
}
public void setSiteUrl(String siteUrl) {
this.siteUrl = siteUrl;
}
public void setReleaseList(List<ProjectRelease> releaseList) {
this.releaseList = releaseList;
}
public void setAggregator(boolean isAggregator) {
this.isAggregator = isAggregator;
}
public String getName() {
return name;
}
public String getId() {
return id;
}
/**
* @return The list of releases sorted in descending order by version
*/
public List<ProjectRelease> getProjectReleases() {
releaseList.sort(Collections.reverseOrder(ProjectRelease::compareTo));
return releaseList;
}
public String getRepoUrl() {
return repoUrl;
}
public String getSiteUrl() {
return siteUrl;
}
public boolean hasSite() {
return !siteUrl.isEmpty();
}
public boolean isAggregator() {
return isAggregator;
}
public String getStackOverflowTags() {
return stackOverflowTags;
}
public void setStackOverflowTags(String stackOverflowTags) {
this.stackOverflowTags = stackOverflowTags.replaceAll(" ", "");
}
public Set<String> getStackOverflowTagList() {
return StringUtils.commaDelimitedListToSet(this.stackOverflowTags);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Project project = (Project) o;
if (id != null ? !id.equals(project.id) : project.id != null)
return false;
return true;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
@Override
public String toString() {
return "Project{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", repoUrl='" + repoUrl + '\'' +
", siteUrl='" + siteUrl + '\'' +
", releaseList=" + releaseList +
", isAggregator=" + isAggregator +
", stackOverflowTags=" + stackOverflowTags +
'}';
}
public boolean updateProjectRelease(ProjectRelease release) {
boolean found = false;
List<ProjectRelease> releases = getProjectReleases();
for (int i = 0; i < releases.size(); i++) {
ProjectRelease projectRelease = releases.get(i);
if (release.getRepository() != null && release.getRepository().equals(projectRelease.getRepository())) {
release.setRepository(projectRelease.getRepository());
}
if (projectRelease.getVersion().equals(release)) {
releases.set(i, release);
found = true;
break;
}
}
if (!found) {
releases.add(release);
}
release.replaceVersionPattern();
return found;
}
public ProjectRelease removeProjectRelease(String version) {
List<ProjectRelease> releases = getProjectReleases();
ProjectRelease release = null;
for (int i = 0; i < releases.size(); i++) {
ProjectRelease projectRelease = releases.get(i);
if (projectRelease.getVersion().equals(version)) {
release = releases.remove(i);
return release;
}
}
return null;
}
public ProjectRelease getProjectRelease(String version) {
List<ProjectRelease> releases = getProjectReleases();
for (ProjectRelease release : releases) {
if (release.getVersion().equals(version)) {
return release;
}
}
return null;
}
}