package org.vertexium;
import org.vertexium.util.ConvertingIterable;
import org.vertexium.util.FilterIterable;
import java.util.Iterator;
public abstract class ExtendedDataRowBase implements ExtendedDataRow {
@Override
public abstract ExtendedDataRowId getId();
@Override
public Iterable<String> getPropertyNames() {
return new ConvertingIterable<Property, String>(getProperties()) {
@Override
protected String convert(Property prop) {
return prop.getName();
}
};
}
@Override
public abstract Iterable<Property> getProperties();
@Override
public Property getProperty(String name) {
return getProperty(null, name, null);
}
@Override
public Object getPropertyValue(String name) {
return getPropertyValue(null, name);
}
@Override
public Property getProperty(String key, String name) {
return getProperty(key, name, null);
}
@Override
public Property getProperty(String key, String name, Visibility visibility) {
for (Property property : getProperties()) {
if (isMatch(property, key, name, visibility)) {
return property;
}
}
return null;
}
private boolean isMatch(Property property, String key, String name, Visibility visibility) {
if (name != null && !property.getName().equals(name)) {
return false;
}
if (key != null && !property.getKey().equals(key)) {
return false;
}
if (visibility != null && !property.getVisibility().equals(visibility)) {
return false;
}
return true;
}
@Override
public Property getProperty(String name, Visibility visibility) {
return getProperty(null, name, visibility);
}
@Override
public Iterable<Property> getProperties(String name) {
return getProperties(null, name);
}
@Override
public Iterable<Property> getProperties(String key, String name) {
return new FilterIterable<Property>(getProperties()) {
@Override
protected boolean isIncluded(Property prop) {
return isMatch(prop, key, name, null);
}
};
}
@Override
public Iterable<Object> getPropertyValues(String name) {
return getPropertyValues(null, name);
}
@Override
public Iterable<Object> getPropertyValues(String key, String name) {
return new ConvertingIterable<Property, Object>(getProperties(key, name)) {
@Override
protected Object convert(Property prop) {
return prop.getValue();
}
};
}
@Override
public Object getPropertyValue(String key, String name) {
Property prop = getProperty(key, name);
if (prop == null) {
return null;
}
return prop.getValue();
}
@Override
public Object getPropertyValue(String name, int index) {
return getPropertyValue(null, name, index);
}
@Override
public Object getPropertyValue(String key, String name, int index) {
Iterator<Object> values = getPropertyValues(key, name).iterator();
while (values.hasNext() && index > 0) {
values.next();
index--;
}
if (!values.hasNext()) {
return null;
}
return values.next();
}
@Override
public int compareTo(Object o) {
if (o instanceof ExtendedDataRow) {
return getId().compareTo(((ExtendedDataRow) o).getId());
}
throw new ClassCastException("o must be an " + ExtendedDataRow.class.getName());
}
}