package com.constellio.model.services.records.cache; import java.util.List; import com.constellio.data.dao.dto.records.RecordDTO; import com.constellio.model.entities.batchprocess.BatchProcess; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.records.wrappers.RecordWrapper; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.ModificationImpact; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.BaseRecordServices; import com.constellio.model.services.records.RecordImpl; import com.constellio.model.services.records.RecordLogicalDeleteOptions; import com.constellio.model.services.records.RecordPhysicalDeleteOptions; import com.constellio.model.services.records.RecordModificationImpactHandler; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.records.RecordServicesException.ValidationException; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.taxonomies.TaxonomiesManager; public class CachedRecordServices extends BaseRecordServices implements RecordServices { RecordsCaches recordsCaches; RecordServices recordServices; public CachedRecordServices(ModelLayerFactory modelLayerFactory, RecordServices recordServices, RecordsCaches recordsCaches) { super(modelLayerFactory); this.recordServices = recordServices; this.recordsCaches = recordsCaches; } @Override public Record getDocumentById(String id) { Record record = recordsCaches.getRecord(id); if (record == null) { record = recordServices.getDocumentById(id); recordsCaches.insert(record); } return record; } @Override public Record getRecordByMetadata(Metadata metadata, String value) { if (!metadata.isUniqueValue()) { throw new IllegalArgumentException("Metadata '" + metadata + "' is not unique"); } if (metadata.getCode().startsWith("global")) { throw new IllegalArgumentException("Metadata '" + metadata + "' is global, which has no specific schema type."); } Record foundRecord = recordsCaches.getCache(metadata.getCollection()).getByMetadata(metadata, value); if (foundRecord == null) { foundRecord = recordServices.getRecordByMetadata(metadata, value); if (foundRecord != null) { recordsCaches.insert(foundRecord); } } return foundRecord; } @Override public List<Record> getRecordsById(String collection, List<String> ids) { // RecordsCache cache = recordsCaches.getCache(collection); // List<Record> records = new ArrayList<>(); // List<String> unfoundIds = new ArrayList<>(); // for (int i = 0; i < ids.size(); i++) { // Record cachedRecord = cache.get(ids.get(i)); // records.add(cachedRecord); // if (cachedRecord == null) { // unfoundIds.add(ids.get(i)); // } // } // // if (!unfoundIds.isEmpty()) { // List<Record> missingRecords = recordServices.getRecordsById(collection, unfoundIds); // for(int i = 0 ; i < ids.size() ; i++) { // if (records.get(i) == null) { // int index = // } // } // int index = ids.indexOf(m) // } return recordServices.getRecordsById(collection, ids); } @Override public void refresh(List<?> records) { recordServices.refresh(records); } @Override public List<String> getRecordTitles(String collection, List<String> recordIds) { return recordServices.getRecordTitles(collection, recordIds); } //These services are not cached @Override public List<Record> toRecords( List<RecordDTO> recordDTOs, boolean fullyLoaded) { return recordServices.toRecords(recordDTOs, fullyLoaded); } @Override public void execute(Transaction transaction) throws RecordServicesException { recordServices.execute(transaction); } @Override public void executeWithoutImpactHandling(Transaction transaction) throws RecordServicesException { recordServices.executeWithoutImpactHandling(transaction); } @Override public void executeWithImpactHandler(Transaction transaction, RecordModificationImpactHandler handler) throws RecordServicesException { recordServices.executeWithImpactHandler(transaction, handler); } @Override public List<BatchProcess> executeHandlingImpactsAsync(Transaction transaction) throws RecordServicesException { return recordServices.executeHandlingImpactsAsync(transaction); } @Override public Record toRecord(RecordDTO recordDTO, boolean fullyLoaded) { return recordServices.toRecord(recordDTO, fullyLoaded); } @Override public long documentsCount() { return recordServices.documentsCount(); } @Override public void validateRecordInTransaction(Record record, Transaction transaction) throws ValidationException { recordServices.validateRecordInTransaction(record, transaction); } @Override public void validateRecord(Record record) throws ValidationException { recordServices.validateRecord(record); } @Override public Record newRecordWithSchema( MetadataSchema schema, String id) { return recordServices.newRecordWithSchema(schema, id); } @Override public Record newRecordWithSchema( MetadataSchema schema) { return recordServices.newRecordWithSchema(schema); } @Override public List<ModificationImpact> calculateImpactOfModification( Transaction transaction, TaxonomiesManager taxonomiesManager, SearchServices searchServices, MetadataSchemaTypes metadataSchemaTypes, boolean executedAfterTransaction) { return recordServices.calculateImpactOfModification(transaction, taxonomiesManager, searchServices, metadataSchemaTypes, executedAfterTransaction); } @Override public RecordsCaches getRecordsCaches() { return recordsCaches; } @Override public boolean isRestorable(Record record, User user) { return recordServices.isRestorable(record, user); } @Override public void restore(Record record, User user) { recordServices.restore(record, user); } @Override public boolean isPhysicallyDeletable(Record record, User user) { return recordServices.isPhysicallyDeletable(record, user); } @Override public void physicallyDelete(Record record, User user) { recordServices.physicallyDelete(record, user); } @Override public void physicallyDelete(Record record, User user, RecordPhysicalDeleteOptions options) { recordServices.physicallyDelete(record, user, options); } @Override public void physicallyDeleteNoMatterTheStatus(Record record, User user, RecordPhysicalDeleteOptions options) { recordServices.physicallyDeleteNoMatterTheStatus(record, user, options); } @Override public boolean isLogicallyDeletable(Record record, User user) { return recordServices.isLogicallyDeletable(record, user); } @Override public boolean isLogicallyThenPhysicallyDeletable(Record record, User user) { return recordServices.isLogicallyThenPhysicallyDeletable(record, user); } @Override public boolean isPrincipalConceptLogicallyDeletableExcludingContent(Record record, User user) { return recordServices.isPrincipalConceptLogicallyDeletableExcludingContent(record, user); } @Override public boolean isPrincipalConceptLogicallyDeletableIncludingContent(Record record, User user) { return recordServices.isPrincipalConceptLogicallyDeletableIncludingContent(record, user); } @Override public void logicallyDelete(Record record, User user) { recordServices.logicallyDelete(record, user); } @Override public void logicallyDelete(Record record, User user, RecordLogicalDeleteOptions options) { recordServices.logicallyDelete(record, user, options); } @Override public List<Record> getVisibleRecordsWithReferenceTo( Record record, User user) { return recordServices.getVisibleRecordsWithReferenceTo(record, user); } @Override public boolean isReferencedByOtherRecords(Record record) { return recordServices.isReferencedByOtherRecords(record); } @Override public void flush() { recordServices.flush(); } @Override public void removeOldLocks() { recordServices.removeOldLocks(); } @Override public void recalculate(RecordWrapper recordWrapper) { recordServices.recalculate(recordWrapper); } @Override public void recalculate(Record record) { recordServices.recalculate(record); } @Override public void loadLazyTransientMetadatas(Record record) { recordServices.loadLazyTransientMetadatas(record); } @Override public void reloadEagerTransientMetadatas(Record record) { recordServices.reloadEagerTransientMetadatas(record); } }