package com.revolsys.geometry.cs;
import java.io.Serializable;
import javax.measure.quantity.Length;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;
import javax.measure.unit.Unit;
public class LinearUnit implements Serializable {
/**
*
*/
private static final long serialVersionUID = 4000991484199279234L;
/**
* Get the linear unit representing the conversion factor from
* {@link SI#METER}.
*
* @param conversionFactor The conversion factor.
* @return The linear unit.
*/
public static Unit<Length> getUnit(final double conversionFactor) {
return getUnit(null, conversionFactor);
}
/**
* Get the linear unit representing the conversion factor from the specified
* base linear unit.
*
* @param baseUnit The base unit.
* @param conversionFactor The conversion factor.
* @return The linear unit.
*/
@SuppressWarnings({
"rawtypes", "unchecked"
})
public static Unit<Length> getUnit(final Unit<Length> baseUnit, final double conversionFactor) {
Unit<Length> unit;
if (baseUnit == null) {
unit = SI.METRE;
} else {
unit = baseUnit;
}
if (conversionFactor != 1) {
unit = unit.times(conversionFactor);
// Normalize the unit
for (final Unit siUnit : SI.getInstance().getUnits()) {
if (siUnit.equals(unit)) {
return siUnit;
}
}
for (final Unit nonSiUnit : NonSI.getInstance().getUnits()) {
if (nonSiUnit.equals(unit)) {
return nonSiUnit;
}
}
}
return unit;
}
private final Authority authority;
private final LinearUnit baseUnit;
private final double conversionFactor;
private final boolean deprecated;
private final String name;
private Unit<Length> unit;
public LinearUnit(final String name, final double conversionFactor, final Authority authority) {
this(name, null, conversionFactor, authority, false);
}
public LinearUnit(final String name, final LinearUnit baseUnit, final double conversionFactor,
final Authority authority) {
this(name, baseUnit, conversionFactor, authority, false);
}
public LinearUnit(final String name, final LinearUnit baseUnit, final double conversionFactor,
final Authority authority, final boolean deprecated) {
this.name = name;
this.baseUnit = baseUnit;
this.conversionFactor = conversionFactor;
this.authority = authority;
this.deprecated = deprecated;
if (baseUnit == null) {
this.unit = getUnit(conversionFactor);
} else {
this.unit = getUnit(baseUnit.getUnit(), conversionFactor);
}
}
@Override
public boolean equals(final Object object) {
if (object == null) {
return false;
} else if (object == this) {
return true;
} else if (object instanceof LinearUnit) {
final LinearUnit unit = (LinearUnit)object;
if (this.name == null && unit.name != null || !this.name.equals(unit.name)) {
return false;
} else if (Math.abs(this.conversionFactor - unit.conversionFactor) > 1.0e-10) {
return false;
} else {
return true;
}
} else {
return false;
}
}
public Authority getAuthority() {
return this.authority;
}
public LinearUnit getBaseUnit() {
return this.baseUnit;
}
public double getConversionFactor() {
return this.conversionFactor;
}
public String getName() {
return this.name;
}
public Unit<Length> getUnit() {
return this.unit;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.name.hashCode();
final long temp = Double.doubleToLongBits(this.conversionFactor);
result = prime * result + (int)(temp ^ temp >>> 32);
return result;
}
public boolean isDeprecated() {
return this.deprecated;
}
@Override
public String toString() {
return this.name;
}
}