/* Copyright (c) 2012-2014 Boundless and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Distribution License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/org/documents/edl-v10.html
*
* Contributors:
* Gabriel Roldan (Boundless) - initial implementation
*/
package org.locationtech.geogig.api;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Ordering;
/**
* Base object type accessed during revision walking.
*
* @see RevCommit
* @see RevTree
* @see RevFeature
* @see RevFeature
* @see RevTag
*/
public interface RevObject {
/**
* A "natural order" {@link Ordering comparator} for revobject instances based on the
* {@link ObjectId}
*/
public static final Ordering<RevObject> NATURAL_ORDER = new Ordering<RevObject>() {
@Override
public int compare(RevObject o1, RevObject o2) {
return o1.getId().compareTo(o2.getId());
}
};
/**
* {@code RevObject} types enumeration.
*/
public static enum TYPE {
COMMIT {
@Override
public int value() {
return 0;
}
@Override
public Class<RevCommit> binding() {
return RevCommit.class;
}
},
TREE {
@Override
public int value() {
return 1;
}
@Override
public Class<RevTree> binding() {
return RevTree.class;
}
},
FEATURE {
@Override
public int value() {
return 2;
}
@Override
public Class<RevFeature> binding() {
return RevFeature.class;
}
},
TAG {
@Override
public int value() {
return 3;
}
@Override
public Class<RevTag> binding() {
return RevTag.class;
}
},
FEATURETYPE {
@Override
public int value() {
return 4;
}
@Override
public Class<RevFeatureType> binding() {
return RevFeatureType.class;
}
};
public abstract int value();
public abstract Class<? extends RevObject> binding();
public static TYPE valueOf(final int value) {
return TYPE.values()[value];
}
private static final ImmutableMap<Class<? extends RevObject>, Integer> byBinding = ImmutableMap
.of(COMMIT.binding(), COMMIT.value(), TREE.binding(), TREE.value(),
FEATURE.binding(), FEATURE.value(), TAG.binding(), TAG.value(),
FEATURETYPE.binding(), FEATURETYPE.value());
public static TYPE valueOf(final Class<? extends RevObject> binding) {
Preconditions.checkNotNull(binding);
Integer value = byBinding.get(binding);
Preconditions.checkNotNull(value);
return valueOf(value);
}
}
/**
* @return the object type of this object
*/
public TYPE getType();
/**
* Get the name of this object.
*
* @return unique hash of this object.
*/
public ObjectId getId();
/**
* Equality is based on id
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o);
}