blob: 30a0dfffccd32c95b92d8d30a8bd0c056b325c09 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Intalio, Inc.
* ======================================================================
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* The Apache License v2.0 is available at
* http://www.opensource.org/licenses/apache2.0.php
*
* You may elect to redistribute this code under either of these licenses.
*******************************************************************************/
package org.eclipse.jetty.toolchain.version;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.codehaus.plexus.util.StringUtils;
import org.eclipse.jetty.toolchain.version.issues.Issue;
import org.eclipse.jetty.toolchain.version.issues.IssueComparator;
import edu.emory.mathcs.backport.java.util.Collections;
public class Release
{
private static final List<String> RELEASED_ON_FORMATS;
static
{
RELEASED_ON_FORMATS = new ArrayList<String>();
RELEASED_ON_FORMATS.add("M/d/yyyy"); // USA Format (shorthand)
RELEASED_ON_FORMATS.add("EEE d MMMM yyyy"); // USA Format w/Weekday
RELEASED_ON_FORMATS.add("d MMMM yyyy"); // USA Format
RELEASED_ON_FORMATS.add("MMMM d yyyy"); // Month Day Year
RELEASED_ON_FORMATS.add("MMMM yyyy"); // Month Year
}
private boolean existing = false;
private List<Issue> issues = new ArrayList<Issue>();
private Date releasedOn;
private String version;
public Release()
{
/* anonymous version */
}
public Release(String ver)
{
this.version = ver;
}
public void addIssue(Issue issue)
{
if (issue == null)
{
return;
}
if (!issues.contains(issue))
{
this.issues.add(issue);
}
}
public void addIssues(List<Issue> moreIssues)
{
for (Issue issue : moreIssues)
{
addIssue(issue);
}
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
Release other = (Release)obj;
if (version == null)
{
if (other.version != null)
{
return false;
}
}
else if (!version.equals(other.version))
{
return false;
}
return true;
}
public List<Issue> getIssues()
{
return issues;
}
public Date getReleasedOn()
{
return releasedOn;
}
public List<Issue> getSortedIssues()
{
Collections.sort(issues,new IssueComparator());
return issues;
}
public String getVersion()
{
return version;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((version == null)?0:version.hashCode());
return result;
}
public boolean isExisting()
{
return existing;
}
public void parseReleasedOn(int linenum, String rawdateStr)
{
if (StringUtils.isBlank(rawdateStr))
{
releasedOn = null;
return;
}
String rawdate = rawdateStr.trim();
if (rawdate.startsWith("- "))
{
rawdate = rawdate.substring(2);
}
// Strip Ordinals
String ordinals[] = new String[]
{ "st", "nd", "rd", "th" };
String simp;
Pattern ordPat;
Matcher mat;
for (String ordinal : ordinals)
{
ordPat = Pattern.compile("[0-9]" + ordinal);
mat = ordPat.matcher(rawdate);
if (mat.find())
{
simp = rawdate.substring(0,mat.start()) + rawdate.charAt(mat.start()) + rawdate.substring(mat.end());
rawdate = simp;
}
}
// Attempt to parse date
SimpleDateFormat sdf;
for (String format : RELEASED_ON_FORMATS)
{
sdf = new SimpleDateFormat(format);
try
{
releasedOn = sdf.parse(rawdate);
if (releasedOn != null)
{
return; // Got a valid date.
}
}
catch (ParseException ignore)
{
/* ignore */
}
}
if (releasedOn == null)
{
System.err.printf("ERROR: Unable to parse raw date string [%s] on line #%d%n",rawdate,linenum);
}
}
public void setExisting(boolean existing)
{
this.existing = existing;
}
public void setIssues(List<Issue> issues)
{
this.issues.clear();
this.issues.addAll(issues);
}
public void setReleasedOn(Date releasedOn)
{
this.releasedOn = releasedOn;
}
public void setVersion(String version)
{
this.version = version;
}
@Override
public String toString()
{
StringBuilder buf = new StringBuilder();
buf.append("Release[");
buf.append("version=").append(version);
buf.append(",releasedOn=");
if (releasedOn == null)
{
buf.append("<null>");
}
else
{
buf.append(new SimpleDateFormat("MMM yyyy").format(releasedOn));
}
buf.append(",issues.size=").append(issues.size());
buf.append("]");
return buf.toString();
}
}