package org.javers.core.metamodel.clazz;
import java.util.Optional;
import org.javers.core.metamodel.type.CustomType;
import org.javers.core.metamodel.type.EntityType;
import org.javers.core.metamodel.type.ValueObjectType;
import org.javers.core.metamodel.type.ValueType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.javers.common.validation.Validate.argumentsAreNotNull;
/**
* Recipe for {@link EntityType}, {@link ValueObjectType}, {@link ValueType} or {@link CustomType}
*
* @author bartosz walacik
*/
public abstract class ClientsClassDefinition {
private final Class<?> baseJavaClass;
private final List<String> ignoredProperties;
private final Optional<String> typeName;
ClientsClassDefinition(Class<?> baseJavaClass) {
this(baseJavaClass, Collections.<String>emptyList(), Optional.<String>empty());
}
ClientsClassDefinition(Class<?> baseJavaClass, List<String> ignoredProperties) {
this(baseJavaClass, ignoredProperties, Optional.<String>empty());
}
ClientsClassDefinition(ClientsClassDefinitionBuilder builder) {
this(builder.getClazz(), builder.getIgnoredProperties(), builder.getTypeName());
}
private ClientsClassDefinition(Class<?> baseJavaClass, List<String> ignoredProperties, Optional<String> typeName) {
argumentsAreNotNull(baseJavaClass, typeName, ignoredProperties);
this.baseJavaClass = baseJavaClass;
this.ignoredProperties = new ArrayList<>(ignoredProperties);
this.typeName = typeName;
}
public Class<?> getBaseJavaClass() {
return baseJavaClass;
}
@Override
public boolean equals(Object o) {
if (this == o || getClass() != o.getClass()) {
return false;
}
ClientsClassDefinition that = (ClientsClassDefinition) o;
return baseJavaClass.equals(that.baseJavaClass);
}
@Override
public int hashCode() {
return baseJavaClass.hashCode();
}
public List<String> getIgnoredProperties() {
return Collections.unmodifiableList(ignoredProperties);
}
public Optional<String> getTypeName() {
return typeName;
}
public boolean hasTypeName(){
return typeName.isPresent();
}
}