package com.constellio.app.api.cmis.utils;
import static com.constellio.model.entities.schemas.entries.DataEntryType.CALCULATED;
import static com.constellio.model.services.schemas.SchemaUtils.*;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.SchemaUtils;
public class CmisRecordUtils {
private ModelLayerFactory modelLayerFactory;
public CmisRecordUtils(ModelLayerFactory modelLayerFactory) {
this.modelLayerFactory = modelLayerFactory;
}
public void setParentOfRecord(Record record, Record newParentRecord, MetadataSchema schema) {
List<Metadata> parentReferencesMetadatas = schema.getParentReferences();
List<Metadata> referencesMetadatas = new ArrayList<>();
MetadataSchema targetSchema = null;
if (newParentRecord != null) {
String schemaType = new SchemaUtils().getSchemaTypeCode(newParentRecord.getSchemaCode());
Taxonomy taxonomy = modelLayerFactory.getTaxonomiesManager().getTaxonomyFor(record.getCollection(), schemaType);
if (taxonomy != null) {
referencesMetadatas = schema.getTaxonomyRelationshipReferences(asList(taxonomy));
}
}
if (newParentRecord != null) {
targetSchema = modelLayerFactory.getMetadataSchemasManager().getSchemaTypes(record.getCollection())
.getSchema(newParentRecord.getSchemaCode());
}
List<Metadata> allReferencesMetadatas = new ArrayList<>();
allReferencesMetadatas.addAll(parentReferencesMetadatas);
allReferencesMetadatas.addAll(referencesMetadatas);
for (Metadata referenceMetadata : allReferencesMetadatas) {
if (referenceMetadata.isTaxonomyRelationship() && referenceMetadata.getDataEntry().getType() == CALCULATED) {
referenceMetadata = getMetadataUsedByCalculatedReferenceWithTaxonomyRelationship(schema, referenceMetadata);
}
if (targetSchema != null && referenceMetadata.getAllowedReferences().isAllowed(targetSchema)) {
record.set(referenceMetadata, newParentRecord);
}
}
}
public static GregorianCalendar toGregorianCalendar(Object value) {
if (value != null && value instanceof LocalDateTime) {
return ((LocalDateTime) value).toDateTime().toGregorianCalendar();
} else if (value != null && value instanceof LocalDate) {
return ((LocalDate) value).toDateTimeAtStartOfDay().toGregorianCalendar();
} else {
return null;
}
}
}