From 248777191e375fe96abb09bceea71f0873f87f3e Mon Sep 17 00:00:00 2001
From: freddyDOTCMS
Date: Fri, 22 Nov 2024 07:11:24 -0600
Subject: [PATCH 01/19] Cleaning up after delete a Contentlet
---
.../config/DotInitializationService.java | 6 +-
.../business/ESContentFactoryImpl.java | 4 +-
.../UniqueFieldValidationStrategy.java | 11 +-
.../DBUniqueFieldValidationStrategy.java | 66 ++-
.../extratable/UniqueFieldCriteria.java | 19 +-
.../extratable/UniqueFieldDataBaseUtil.java | 67 ++-
.../extratable/UniqueFieldsTableCleaner.java | 45 ++
.../UniqueFieldsTableCleanerInitializer.java | 26 ++
.../com/dotcms/variant/VariantAPIImpl.java | 6 +-
.../DeleteContentletVersionInfoEvent.java | 28 ++
.../dotmarketing/business/VersionableAPI.java | 4 +-
.../business/VersionableAPIImpl.java | 14 +-
.../business/ESContentletAPIImplTest.java | 433 +++++++++++++++++-
.../business/ESMappingAPITest.java | 5 +-
14 files changed, 665 insertions(+), 69 deletions(-)
create mode 100644 dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/extratable/UniqueFieldsTableCleaner.java
create mode 100644 dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/extratable/UniqueFieldsTableCleanerInitializer.java
create mode 100644 dotCMS/src/main/java/com/dotmarketing/business/DeleteContentletVersionInfoEvent.java
diff --git a/dotCMS/src/main/java/com/dotcms/config/DotInitializationService.java b/dotCMS/src/main/java/com/dotcms/config/DotInitializationService.java
index efd564bf2abe..1712240539d1 100644
--- a/dotCMS/src/main/java/com/dotcms/config/DotInitializationService.java
+++ b/dotCMS/src/main/java/com/dotcms/config/DotInitializationService.java
@@ -5,7 +5,10 @@
import com.dotcms.api.system.event.PayloadVerifierFactoryInitializer;
import com.dotcms.api.system.event.SystemEventProcessorFactoryInitializer;
import com.dotcms.business.SystemTableInitializer;
+import com.dotcms.cdi.CDIUtils;
import com.dotcms.contenttype.business.ContentTypeInitializer;
+import com.dotcms.contenttype.business.uniquefields.UniqueFieldValidationStrategyResolver;
+import com.dotcms.contenttype.business.uniquefields.extratable.UniqueFieldsTableCleanerInitializer;
import com.dotcms.rendering.velocity.events.ExceptionHandlersInitializer;
import com.dotcms.system.event.local.business.LocalSystemEventSubscribersInitializer;
import com.dotcms.util.ReflectionUtils;
@@ -131,7 +134,8 @@ private Set getInternalInitializers() {
new ContentTypeInitializer(),
new DefaultVariantInitializer(),
new SystemTableInitializer(),
- new EmbeddingsInitializer()
+ new EmbeddingsInitializer(),
+ CDIUtils.getBeanThrows(UniqueFieldsTableCleanerInitializer.class)
);
} // getInternalInitializers.
diff --git a/dotCMS/src/main/java/com/dotcms/content/elasticsearch/business/ESContentFactoryImpl.java b/dotCMS/src/main/java/com/dotcms/content/elasticsearch/business/ESContentFactoryImpl.java
index 4a8db26a4bc2..324fbe82ccad 100644
--- a/dotCMS/src/main/java/com/dotcms/content/elasticsearch/business/ESContentFactoryImpl.java
+++ b/dotCMS/src/main/java/com/dotcms/content/elasticsearch/business/ESContentFactoryImpl.java
@@ -13,7 +13,6 @@
import com.dotcms.notifications.bean.NotificationLevel;
import com.dotcms.notifications.bean.NotificationType;
import com.dotcms.notifications.business.NotificationAPI;
-import com.dotcms.rendering.velocity.viewtools.content.util.ContentUtils;
import com.dotcms.repackage.net.sf.hibernate.ObjectNotFoundException;
import com.dotcms.rest.api.v1.DotObjectMapperProvider;
import com.dotcms.system.SimpleMapAppContext;
@@ -615,8 +614,7 @@ protected void delete(List contentlets, boolean deleteIdentifier) th
}
if(verInfo.get().getWorkingInode().equals(contentlet.getInode()))
APILocator.getVersionableAPI()
- .deleteContentletVersionInfo(contentlet.getIdentifier(),
- contentlet.getLanguageId());
+ .deleteContentletVersionInfoByLanguage(contentlet);
}
delete(contentlet.getInode());
}
diff --git a/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/UniqueFieldValidationStrategy.java b/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/UniqueFieldValidationStrategy.java
index 1c5363404a68..28383d926c3f 100644
--- a/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/UniqueFieldValidationStrategy.java
+++ b/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/UniqueFieldValidationStrategy.java
@@ -102,7 +102,6 @@ void innerValidate(final Contentlet contentlet, final Field field, final Object
default void afterSaved(final Contentlet contentlet, final boolean isNew) throws DotDataException, DotSecurityException {
// Default implementation does nothing
}
-
default void recalculate(final Field field, final boolean uniquePerSite) throws UniqueFieldValueDuplicatedException {
// Default implementation does nothing
}
@@ -120,4 +119,14 @@ default void validateField(final Field field) {
}
}
+ /**
+ * Clean the Extra unique validation field table after a {@link Contentlet} have been removed.
+ * We need to remove all the unique values of this {@link Contentlet} and {@link com.dotmarketing.portlets.languagesmanager.model.Language}
+ * from the extra table.
+ *
+ * @param contentlet
+ */
+ default void cleanUp(final Contentlet contentlet, final boolean deleteAllVariant) throws DotDataException {
+ //Default implementation do nothing
+ }
}
diff --git a/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/extratable/DBUniqueFieldValidationStrategy.java b/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/extratable/DBUniqueFieldValidationStrategy.java
index 708d497a2859..d36f467f2d80 100644
--- a/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/extratable/DBUniqueFieldValidationStrategy.java
+++ b/dotCMS/src/main/java/com/dotcms/contenttype/business/uniquefields/extratable/DBUniqueFieldValidationStrategy.java
@@ -10,6 +10,7 @@
import com.dotcms.util.JsonUtil;
import com.dotmarketing.beans.Host;
import com.dotmarketing.business.APILocator;
+import com.dotmarketing.business.DotStateException;
import com.dotmarketing.exception.DotDataException;
import com.dotmarketing.exception.DotRuntimeException;
import com.dotmarketing.exception.DotSecurityException;
@@ -65,7 +66,7 @@ public void innerValidate(final Contentlet contentlet, final Field field, final
final ContentType contentType) throws UniqueFieldValueDuplicatedException, DotDataException, DotSecurityException {
if (isContentletBeingUpdated(contentlet)) {
- cleanUniqueFieldsUp(contentlet, field);
+ cleanUniqueFieldsUp(contentlet);
}
final User systemUser = APILocator.systemUser();
@@ -78,6 +79,7 @@ public void innerValidate(final Contentlet contentlet, final Field field, final
.setContentType(contentType)
.setValue(fieldValue)
.setVariantName(contentlet.getVariantId())
+ .setLive(isLive(contentlet))
.build();
insertUniqueValue(uniqueFieldCriteria, contentlet.getIdentifier());
@@ -103,32 +105,35 @@ private static boolean isContentletBeingUpdated(final Contentlet contentlet) {
* is not re-generated as the Contentlet ID is not used in it.
*
* @param contentlet The {@link Contentlet} being updated.
- * @param field The {@link Field} representing the Unique Field.
*
* @throws DotDataException An error occurred when interacting with the database.
*/
@SuppressWarnings("unchecked")
- private void cleanUniqueFieldsUp(final Contentlet contentlet, final Field field) throws DotDataException {
- final Optional