package org.geotools.coverage.io.impl.range;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import javax.measure.Measure;
import javax.measure.quantity.Dimensionless;
import javax.measure.unit.Unit;
/**
* Used to create Axis keys based on a fixed set of machine readable strings.
* <p>
* Fixed set of strings are represented as an Enumeration in the GeoTools library. This
* forms a data dictionary (or "formal vocabulary") that is well defined and closed
* to further additions.
* <p>
* This is a great tool for dealing well defined keys such as RGB or CMKY; for most
* data products you may wish to consider a CodeList instead.
* <p>
* Please note that this Measure is considered Dimensionless; if your keys actually belong
* to a domain you should use the appropriate value and Unit to define them.
*
* @param <V> Enumeration provided a fixed set of machine readable strings
*
*
* @source $URL: http://svn.osgeo.org/geotools/trunk/modules/unsupported/coverage-experiment/coverage-api/src/main/java/org/geotools/coverage/io/impl/range/EnumMeasure.java $
*/
public class EnumMeasure<V extends Enum<V>> extends Measure<V, Dimensionless> {
private static final long serialVersionUID = 2403097126807167994L;
private V value;
/** Create a measure out of the provided Enum */
private EnumMeasure( V value ){
this.value = value;
}
@Override
public double doubleValue(Unit<Dimensionless> unit) {
return value.ordinal();
}
@Override
public Unit<Dimensionless> getUnit() {
return Unit.ONE;
}
@Override
public V getValue() {
return value;
}
@Override
public Measure<V, Dimensionless> to(Unit<Dimensionless> unit) {
return this;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
EnumMeasure<?> other = (EnumMeasure<?>) obj;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
/**
* Create a Measure wrapping around the provided Enumeration.
* @param <E>
* @param enumeration
* @return
*/
public static <E extends Enum<E>> EnumMeasure<E> valueOf( E enumeration ){
return new EnumMeasure<E>( enumeration );
}
public static <E extends Enum<E>> List<Measure<E,Dimensionless>> valueOf( Class<E> elementType ){
return valueOf( EnumSet.allOf( elementType ));
}
public static <E extends Enum<E>> List<Measure<E,Dimensionless>> valueOf( EnumSet<E> set ){
List<Measure<E,Dimensionless>> list = new ArrayList<Measure<E,Dimensionless>>();
for( E entry : set ){
list.add( new EnumMeasure<E>( entry ));
}
return list;
}
}