package com.constellio.model.entities.calculators.dependencies;
import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.data.utils.ImpossibleRuntimeException;
import com.constellio.model.entities.calculators.DynamicDependencyValues;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.services.records.RecordServicesRuntimeException.RecordServicesRuntimeException_CalculatorIsUsingAnForbiddenMetadata;
public abstract class DynamicLocalDependency implements Dependency {
private static final Logger LOGGER = LoggerFactory.getLogger(DynamicLocalDependency.class);
@Override
public MetadataValueType getReturnType() {
return null;
}
@Override
public boolean isMultivalue() {
return false;
}
@Override
public boolean isRequired() {
return false;
}
@Override
public String getLocalMetadataCode() {
return null;
}
public boolean isIncludingGlobalMetadatas() {
return false;
}
public abstract boolean isDependentOf(Metadata metadata);
/*
public LocalDate getDate(String metadata, DynamicDependencyValues values) {
if (metadata == null) {
return null;
} else {
Object dateOrDateTime;
try {
dateOrDateTime = values.getValue(metadata);
} catch (RecordServicesRuntimeException_CalculatorIsUsingAnForbiddenMetadata e) {
LOGGER.warn("Cannot get value of forbidden metadata '" + metadata + "'");
dateOrDateTime = null;
}
return convert(metadata, dateOrDateTime);
}
}
private LocalDate convert(String metadata, Object dateOrDateTime) {
if (dateOrDateTime == null) {
return null;
} else if (dateOrDateTime instanceof LocalDate) {
return (LocalDate) dateOrDateTime;
} else if (dateOrDateTime instanceof LocalDateTime) {
return ((LocalDateTime) dateOrDateTime).toLocalDate();
} else if (dateOrDateTime instanceof List) {
List<Object> list = (List) dateOrDateTime;
for (Object item : list) {
if (item != null) {
return convert(metadata, item);
}
}
return null;
} else {
throw new ImpossibleRuntimeException(
"Unsupported type : " + metadata + " with value '" + dateOrDateTime + "' of type '" + dateOrDateTime
.getClass().getName() + "'");
}
}*/
public LocalDate getDate(String metadata, DynamicDependencyValues values, String yearEnd, boolean takeFirstPartOfRange) {
if (metadata == null || values == null) {
return null;
} else {
Object dateOrDateTime;
try {
dateOrDateTime = values.getValue(metadata);
} catch (RecordServicesRuntimeException_CalculatorIsUsingAnForbiddenMetadata e) {
LOGGER.warn("Cannot get value of forbidden metadata '" + metadata + "'");
dateOrDateTime = null;
}
return convert(metadata, dateOrDateTime, yearEnd, takeFirstPartOfRange);
}
}
private LocalDate convert(String metadata, Object date, String yearEnd, boolean takeFirstPartOfRange) {
if (date == null) {
return null;
}
if (date instanceof LocalDate) {
return (LocalDate) date;
} else if (date instanceof LocalDateTime) {
return ((LocalDateTime) date).toLocalDate();
} else if (date instanceof String) {
return dateFromString(metadata, (String) date, yearEnd, takeFirstPartOfRange);
}
if (date instanceof Number) {
return asDate(((Number) date).intValue(), yearEnd);
} else if (date instanceof List) {
List<Object> list = (List) date;
for (Object item : list) {
if (item != null) {
return convert(metadata, item, yearEnd, takeFirstPartOfRange);
}
}
return null;
} else {
throw new ImpossibleRuntimeException(
"Unsupported type : " + metadata + " with value '" + date + "' of type '" + date
.getClass().getName() + "'");
}
}
private LocalDate dateFromString(String metadata, String dateAsString, String yearEnd, boolean takeFirstPartOfRange) {
if (dateAsString.length() != 9) {
throw new RuntimeException("Invalid range date format " + dateAsString + " for metadata " + metadata);
}
try {
int year;
if (takeFirstPartOfRange) {
year = Integer.valueOf((dateAsString).substring(0, 4));
} else {
year = Integer.valueOf((dateAsString).substring(5, 9));
}
return asDate(year, yearEnd);
} catch (NumberFormatException e) {
throw new RuntimeException(
"Invalid range date format " + dateAsString + " should follow pattern 9999-9999" + " for metadata "
+ metadata);
}
}
private LocalDate asDate(int year, String yearEndStr) {
int indexOfSep = yearEndStr.indexOf("/");
int yearEndMonth = Integer.parseInt(yearEndStr.substring(0, indexOfSep));
int yearEndDay = Integer.parseInt(yearEndStr.substring(indexOfSep + 1));
return new LocalDate(year, yearEndMonth, yearEndDay);
}
}