package com.constellio.model.entities.calculators.dependencies;
import java.util.List;
import java.util.SortedMap;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import com.constellio.model.entities.schemas.MetadataValueType;
public class ReferenceDependency<T> implements Dependency {
final String referenceMetadataCode;
final String dependentMetadataCode;
final boolean required;
final boolean multivalue;
final MetadataValueType returnType;
final boolean groupedByReference;
final boolean metadataCreatedLater;
private ReferenceDependency(String referenceMetadataCode, String dependentMetadataCode, MetadataValueType returnType) {
super();
this.referenceMetadataCode = referenceMetadataCode;
this.dependentMetadataCode = dependentMetadataCode;
this.required = false;
this.multivalue = false;
this.returnType = returnType;
this.groupedByReference = false;
this.metadataCreatedLater = false;
}
public ReferenceDependency(String referenceMetadataCode, String dependentMetadataCode, boolean required, boolean multivalue,
MetadataValueType returnType, boolean groupedByReference, boolean metadataCreatedLater) {
super();
this.referenceMetadataCode = referenceMetadataCode;
this.dependentMetadataCode = dependentMetadataCode;
this.required = required;
this.multivalue = multivalue;
this.returnType = returnType;
this.groupedByReference = groupedByReference;
this.metadataCreatedLater = metadataCreatedLater;
}
public boolean isGroupedByReference() {
return groupedByReference;
}
public boolean isMetadataCreatedLater() {
return metadataCreatedLater;
}
public <Z> ReferenceDependency<Z> whichIsCreatedLater() {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, required, multivalue, returnType,
groupedByReference, true);
}
public <Z> ReferenceDependency<Z> whichIsRequired() {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, true, multivalue, returnType,
groupedByReference, metadataCreatedLater);
}
public <Z> ReferenceDependency<SortedMap<String, List<Z>>> whichAreReferencedMultiValueGroupedByReference() {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, required, true, returnType, true,
metadataCreatedLater);
}
public <Z> ReferenceDependency<SortedMap<String, Z>> whichAreReferencedSingleValueGroupedByReference() {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, required, true, returnType, true,
metadataCreatedLater);
}
public <Z> ReferenceDependency<List<Z>> whichIsMultivalue() {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, required, true, returnType,
groupedByReference, metadataCreatedLater);
}
//@formatter:off
public static <Z> ReferenceDependency<Z> toAnEnum(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.ENUM, false, false);
}
public static ReferenceDependency<String> toAString(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.STRING, false, false);
}
public static ReferenceDependency<String> toAReference(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.REFERENCE, false, false);
}
public static ReferenceDependency<Boolean> toABoolean(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.BOOLEAN, false, false);
}
public static ReferenceDependency<Double> toANumber(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.NUMBER, false, false);
}
public static ReferenceDependency<LocalDate> toADate(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.DATE, false, false);
}
public static ReferenceDependency<LocalDateTime> toADateTime(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.DATE_TIME, false, false);
}
public static <T> ReferenceDependency<T> toAStructure(String referenceMetadataCode, String dependentMetadataCode) {
return new ReferenceDependency<>(referenceMetadataCode, dependentMetadataCode, false, false, MetadataValueType.STRUCTURE, false, false);
}
//@formatter:on
@Override
public String getLocalMetadataCode() {
return referenceMetadataCode;
}
public String getDependentMetadataCode() {
return dependentMetadataCode;
}
@Override
public MetadataValueType getReturnType() {
return returnType;
}
@Override
public boolean isMultivalue() {
return multivalue;
}
@Override
public boolean isRequired() {
return required;
}
@Override
public int hashCode() {
return (referenceMetadataCode + dependentMetadataCode).hashCode();
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
@Override
public String toString() {
return "ReferenceDependency{" +
"referenceMetadataCode='" + referenceMetadataCode + '\'' +
", dependentMetadataCode='" + dependentMetadataCode + '\'' +
'}';
}
}