blob: c94746a3efaa7c4ae66cb37d04ac3c41f56cf2a6 [file] [log] [blame]
/**
* @copyright
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
* ====================================================================
* @endcopyright
*/
package org.tigris.subversion.javahl;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* Class to specify a revision in a svn command.
*/
public class Revision implements java.io.Serializable
{
// Update the serialVersionUID when there is an incompatible change made to
// this class. See the Java documentation (following link or its counter-
// part in your specific Java release) for when a change is incompatible.
// https://docs.oracle.com/en/java/javase/11/docs/specs/serialization/version.html#type-changes-affecting-serialization
private static final long serialVersionUID = 1L;
/**
* kind of revision specified
*/
protected int revKind;
/**
* Create a new revision
* @deprecated
* @param kind kind of revision
*/
public Revision(int kind)
{
this(kind, true);
}
/**
* Internally create a new revision
* @param kind kind of revision
* @param marker marker to differentiate from the public deprecated
* version
*/
protected Revision(int kind, boolean marker)
{
if (kind < RevisionKind.unspecified || kind > RevisionKind.head)
throw new IllegalArgumentException(
kind+" is not a legal revision kind");
revKind = kind;
}
/**
* Returns the kind of the Revsion
* @return kind
*/
public int getKind()
{
return revKind;
}
/**
* return the textual representation of the revision
* @return english text
*/
public String toString()
{
switch(revKind) {
case Kind.base : return "BASE";
case Kind.committed : return "COMMITTED";
case Kind.head : return "HEAD";
case Kind.previous : return "PREV";
case Kind.working : return "WORKING";
}
return super.toString();
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode()
{
return revKind * -1;
}
/**
* compare to revision objects
* @param target
* @return if both object have equal content
*/
public boolean equals(Object target) {
if (this == target)
return true;
if (!(target instanceof Revision))
return false;
return ((Revision)target).revKind == revKind;
}
/**
* Creates a Revision.Number object
* @param revisionNumber the revision number of the new object
* @return the new object
* @throws IllegalArgumentException If the specified revision
* number is invalid.
*/
public static Revision getInstance(long revisionNumber)
{
return new Revision.Number(revisionNumber);
}
/**
* Factory which creates {@link #Number} objects for valid
* revision numbers only (those greater than zero). For internal
* usage to avoid an IllegalArgumentException, where no external
* consumer of the javahl API passed an invalid revision number.
*
* @param revNumber The revision number to create an object for.
* @return An object representing <code>revNumber</code>, or
* <code>null</code> if the revision number was invalid.
* @since 1.2
*/
static Number createNumber(long revNumber)
{
return (revNumber < 0 ? null : new Number(revNumber));
}
/**
* Creates a Revision.DateSpec object
* @param revisionDate the date of the new object
* @return the new object
*/
public static Revision getInstance(Date revisionDate)
{
return new Revision.DateSpec(revisionDate);
}
public org.apache.subversion.javahl.types.Revision toApache()
{
return new org.apache.subversion.javahl.types.Revision(Kind.toAKind(revKind));
}
public static Revision createFromApache(
org.apache.subversion.javahl.types.Revision aRev)
{
org.apache.subversion.javahl.types.Revision.Kind kind = aRev.getKind();
switch (kind)
{
case number:
return getInstance(((org.apache.subversion.javahl.types.Revision.Number) aRev).getNumber());
case date:
return getInstance(((org.apache.subversion.javahl.types.Revision.DateSpec) aRev).getDate());
default:
return getInstance(Kind.fromAKind(kind));
}
}
/**
* last committed revision
*/
public static final Revision HEAD = new Revision(Kind.head, true);
/**
* first existing revision
*/
public static final Revision START = new Revision(Kind.unspecified, true);
/**
* last committed revision, needs working copy
*/
public static final Revision COMMITTED = new Revision(Kind.committed,
true);
/**
* previous committed revision, needs working copy
*/
public static final Revision PREVIOUS = new Revision(Kind.previous, true);
/**
* base revision of working copy
*/
public static final Revision BASE = new Revision(Kind.base, true);
/**
* working version in working copy
*/
public static final Revision WORKING = new Revision(Kind.working, true);
/**
* Marker revision number for no real revision
*/
public static final int SVN_INVALID_REVNUM = -1;
/**
* class to specify a Revision by number
*/
public static class Number extends Revision
{
// Update the serialVersionUID when there is a incompatible
// change made to this class.
private static final long serialVersionUID = 1L;
/**
* the revision number
*/
protected long revNumber;
/**
* create a revision by number object
* @param number the number
* @throws IllegalArgumentException If the specified revision
* number is invalid.
*/
public Number(long number)
{
super(Kind.number, true);
if (number < 0)
throw new IllegalArgumentException
("Invalid (negative) revision number: " + number);
revNumber = number;
}
/**
* Returns the revision number
* @return number
*/
public long getNumber()
{
return revNumber;
}
/**
* return the textual representation of the revision
* @return english text
*/
public String toString() {
return Long.toString(revNumber);
}
/**
* compare to revision objects
* @param target
* @return if both object have equal content
*/
public boolean equals(Object target) {
if (!super.equals(target))
return false;
return ((Revision.Number)target).revNumber == revNumber;
}
/* (non-Javadoc)
* @see org.tigris.subversion.javahl.Revision#hashCode()
*/
public int hashCode()
{
return (int)(revNumber ^ (revNumber >>> 32));
}
public org.apache.subversion.javahl.types.Revision toApache()
{
return org.apache.subversion.javahl.types.Revision.getInstance(revNumber);
}
}
/**
* class to specify a revision by a date
*/
public static class DateSpec extends Revision
{
// Update the serialVersionUID when there is a incompatible change
// made to this class.
private static final long serialVersionUID = 1L;
/**
* the date
*/
protected Date revDate;
/**
* create a revision by date object
* @param date
*/
public DateSpec(Date date)
{
super(Kind.date, true);
if (date == null)
throw new IllegalArgumentException("a date must be specified");
revDate = date;
}
/**
* Returns the date of the revision
* @return the date
*/
public Date getDate()
{
return revDate;
}
/**
* return the textual representation of the revision
* @return english text
*/
public String toString() {
SimpleDateFormat dateFormat =
new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z",
Locale.US);
return '{'+dateFormat.format(revDate)+'}';
}
/**
* compare to revision objects
* @param target
* @return if both object have equal content
*/
public boolean equals(Object target) {
if (!super.equals(target))
return false;
return ((Revision.DateSpec)target).revDate.equals(revDate);
}
/* (non-Javadoc)
* @see org.tigris.subversion.javahl.Revision#hashCode()
*/
public int hashCode()
{
return revDate.hashCode();
}
public org.apache.subversion.javahl.types.Revision toApache()
{
return org.apache.subversion.javahl.types.Revision.getInstance(revDate);
}
}
/**
* Various ways of specifying revisions.
*
* Note:
* In contexts where local mods are relevant, the `working' kind
* refers to the uncommitted "working" revision, which may be modified
* with respect to its base revision. In other contexts, `working'
* should behave the same as `committed' or `current'.
*
* the values are defined in RevisionKind because of building reasons
*/
public static final class Kind implements RevisionKind
{
public static int fromAKind(org.apache.subversion.javahl.types.Revision.Kind aKind)
{
switch (aKind)
{
default:
case unspecified:
return RevisionKind.unspecified;
case number:
return RevisionKind.number;
case date:
return RevisionKind.date;
case committed:
return RevisionKind.committed;
case previous:
return RevisionKind.previous;
case base:
return RevisionKind.base;
case head:
return RevisionKind.head;
case working:
return RevisionKind.working;
}
}
public static org.apache.subversion.javahl.types.Revision.Kind toAKind(int kind)
{
switch (kind)
{
default:
case RevisionKind.unspecified:
return org.apache.subversion.javahl.types.Revision.Kind.unspecified;
case RevisionKind.number:
return org.apache.subversion.javahl.types.Revision.Kind.number;
case RevisionKind.date:
return org.apache.subversion.javahl.types.Revision.Kind.date;
case RevisionKind.committed:
return org.apache.subversion.javahl.types.Revision.Kind.committed;
case RevisionKind.previous:
return org.apache.subversion.javahl.types.Revision.Kind.previous;
case RevisionKind.base:
return org.apache.subversion.javahl.types.Revision.Kind.base;
case RevisionKind.head:
return org.apache.subversion.javahl.types.Revision.Kind.head;
case RevisionKind.working:
return org.apache.subversion.javahl.types.Revision.Kind.working;
}
}
}
}