/**
* Licensed to Jasig under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Jasig 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.
*/
package org.jasig.portal.version;
import java.io.Serializable;
import org.jasig.portal.version.om.Version;
/**
* Base class for versions that implements a "correct" equals hashCode, equals and toString
*
* @author Eric Dalquist
*/
public abstract class AbstractVersion implements Version, Serializable {
private static final long serialVersionUID = 1L;
private int hashCode = 0;
@Override
public final boolean isBefore(Version other) {
return compareTo(other) < 0;
}
@Override
public final boolean isAfter(Version other) {
return compareTo(other) > 1;
}
@Override
public final int compareTo(Version o) {
int diff = getMajor() - o.getMajor();
if (diff > 0) {
return 1;
}
if (diff < 0) {
return -1;
}
diff = getMinor() - o.getMinor();
if (diff > 0) {
return 1;
}
if (diff < 0) {
return -1;
}
diff = getPatch() - o.getPatch();
if (diff > 0) {
return 1;
}
if (diff < 0) {
return -1;
}
final Integer l = getLocal();
final Integer ol = o.getLocal();
if (l == ol) {
return 0;
}
if (l == null) {
return -1;
}
if (ol == null) {
return 1;
}
return l.compareTo(ol);
}
@Override
public final int hashCode() {
int result = hashCode;
if (result == 0) {
final int prime = 31;
result = 1;
result = prime * result + getMajor();
result = prime * result + getMinor();
result = prime * result + getPatch();
final Integer local = getLocal();
result = prime * result + ((local == null) ? 0 : local.hashCode());
hashCode = result;
}
return result;
}
@Override
public final boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || obj.hashCode() != this.hashCode())
return false;
if (!(obj instanceof Version))
return false;
Version other = (Version) obj;
if (getMajor() != other.getMajor())
return false;
if (getMinor() != other.getMinor())
return false;
if (getPatch() != other.getPatch())
return false;
final Integer local = getLocal();
final Integer oLocal = other.getLocal();
if (local == null) {
if (oLocal != null)
return false;
}
else if (!local.equals(oLocal))
return false;
return true;
}
@Override
public final String toString() {
final Integer local = getLocal();
if (local == null) {
return getMajor() + "." + getMinor() + "." + getPatch();
}
return getMajor() + "." + getMinor() + "." + getPatch() + "." + local;
}
}