package org.javers.core.metamodel.type;
import org.javers.common.collections.Lists;
import org.javers.common.exception.JaversException;
import org.javers.common.validation.Validate;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Predicate;
import static org.javers.common.exception.JaversExceptionCode.PROPERTY_NOT_FOUND;
import static org.javers.common.validation.Validate.argumentsAreNotNull;
/**
* Decomposes a class into list of properties.
*
* @author bartosz walacik
*/
class ManagedClass {
private final Class<?> baseJavaClass;
private final Map<String, JaversProperty> propertiesByName;
private final List<JaversProperty> managedProperties;
private final List<JaversProperty> looksLikeId;
ManagedClass(Class baseJavaClass, List<JaversProperty> allProperties, List<JaversProperty> looksLikeId) {
argumentsAreNotNull(baseJavaClass, allProperties, looksLikeId);
this.baseJavaClass = baseJavaClass;
this.managedProperties = new ArrayList<>();
this.propertiesByName = new HashMap<>();
this.looksLikeId = looksLikeId;
for (JaversProperty property : allProperties) {
if (!property.hasTransientAnn()){
this.managedProperties.add(property);
}
propertiesByName.put(property.getName(),property);
}
}
ManagedClass createShallowReference(){
return new ManagedClass(baseJavaClass, Collections.emptyList(), getLooksLikeId());
}
/**
* returns all managed properties
*/
List<JaversProperty> getManagedProperties() {
return Collections.unmodifiableList(managedProperties);
}
List<JaversProperty> getLooksLikeId() {
return Collections.unmodifiableList(looksLikeId);
}
Set<String> getPropertyNames(){
return Collections.unmodifiableSet(propertiesByName.keySet());
}
/**
* returns managed properties subset
*/
List<JaversProperty> getManagedProperties(Predicate<JaversProperty> query) {
return Lists.positiveFilter(managedProperties, query);
}
/**
* finds property by name (managed or withTransientAnn)
*
* @throws JaversException PROPERTY_NOT_FOUND
*/
JaversProperty getProperty(String withName) {
Validate.argumentIsNotNull(withName);
if (!propertiesByName.containsKey(withName)){
throw new JaversException(PROPERTY_NOT_FOUND, withName, baseJavaClass.getName());
}
return propertiesByName.get(withName);
}
void forEachProperty(Consumer<JaversProperty> consumer) {
managedProperties.forEach(p -> consumer.accept(p));
}
Class<?> getBaseJavaClass() {
return baseJavaClass;
}
}