diff --git a/admin-console/pom.xml b/admin-console/pom.xml
index f13715026c..82414fff24 100644
--- a/admin-console/pom.xml
+++ b/admin-console/pom.xml
@@ -4,7 +4,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTorg.entando.entandoentando-admin-console
diff --git a/cds-plugin/pom.xml b/cds-plugin/pom.xml
index a70897c1a9..f3b3cf93c8 100644
--- a/cds-plugin/pom.xml
+++ b/cds-plugin/pom.xml
@@ -5,7 +5,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpcdsorg.entando.entando.plugins
diff --git a/cms-plugin/pom.xml b/cms-plugin/pom.xml
index ec7582449a..cb9f84240d 100644
--- a/cms-plugin/pom.xml
+++ b/cms-plugin/pom.xml
@@ -5,7 +5,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTorg.entando.entando.pluginsentando-plugin-jacms
diff --git a/contentscheduler-plugin/pom.xml b/contentscheduler-plugin/pom.xml
index 359af2e148..79877f8992 100644
--- a/contentscheduler-plugin/pom.xml
+++ b/contentscheduler-plugin/pom.xml
@@ -4,7 +4,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpcontentschedulerorg.entando.entando.plugins
@@ -154,6 +154,10 @@
org.junit.jupiterjunit-jupiter-api
+
+ org.mockito
+ mockito-junit-jupiter
+ org.apache.derbyderby
diff --git a/contentscheduler-plugin/src/main/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/ContentSchedulerManager.java b/contentscheduler-plugin/src/main/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/ContentSchedulerManager.java
index 22cb694b1c..1000d4da89 100644
--- a/contentscheduler-plugin/src/main/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/ContentSchedulerManager.java
+++ b/contentscheduler-plugin/src/main/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/ContentSchedulerManager.java
@@ -26,7 +26,6 @@
import com.agiletec.aps.system.common.AbstractService;
import com.agiletec.aps.system.common.entity.model.EntitySearchFilter;
import com.agiletec.aps.system.common.entity.model.attribute.ITextAttribute;
-import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.authorization.IApsAuthority;
import com.agiletec.aps.system.services.authorization.IAuthorizationManager;
import com.agiletec.aps.system.services.baseconfig.ConfigInterface;
@@ -38,11 +37,13 @@
import com.agiletec.plugins.jacms.aps.system.services.cache.CmsCacheWrapperManager;
import com.agiletec.plugins.jacms.aps.system.services.content.IContentManager;
import com.agiletec.plugins.jacms.aps.system.services.content.IContentSearcherDAO;
+import com.agiletec.plugins.jacms.aps.system.services.content.event.PublicContentChangedEvent;
import com.agiletec.plugins.jacms.aps.system.services.content.model.Content;
import com.agiletec.plugins.jpmail.aps.services.mail.IMailManager;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -445,6 +446,10 @@ public void moveOnLineContent(Content content, boolean updateDate, boolean updat
} else {
this.getContentSchedulerDAO().updateContent(content, updateDate);
this.getContentSchedulerDAO().publishContent(content);
+ int operationEventCode = content.isOnLine()
+ ? PublicContentChangedEvent.UPDATE_OPERATION_CODE
+ : PublicContentChangedEvent.INSERT_OPERATION_CODE;
+ this.notifyPublicContentChanging(content, operationEventCode);
}
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "moveOnLineContent");
@@ -472,8 +477,7 @@ public void removeOnLineContent(Content content, boolean updateLastModified) thr
content.setStatus(Content.STATUS_READY);
}
this.getContentSchedulerDAO().unpublishOnLineContent(content);
- // this.notifyPublicContentChanging(content,
- // PublicContentChangedEvent.REMOVE_OPERATION_CODE);
+ this.notifyPublicContentChanging(content, PublicContentChangedEvent.REMOVE_OPERATION_CODE);
this.flushGroups(content.getId(), content.getTypeCode());
} catch (Throwable t) {
ApsSystemUtils.logThrowable(t, this, "removeOnLineContent");
@@ -481,6 +485,27 @@ public void removeOnLineContent(Content content, boolean updateLastModified) thr
}
}
+ /**
+ * Notify the change of a published content to the observing services.
+ * The event is built with the same channel and the same properties
+ * used by ContentManager, so that it is propagated to the
+ * other instances as well.
+ *
+ * @param content The changed content.
+ * @param operationCode The code of the operation to notify.
+ */
+ private void notifyPublicContentChanging(Content content, int operationCode) {
+ Map properties = new HashMap<>();
+ properties.put("contentId", content.getId());
+ properties.put("operationCode", String.valueOf(operationCode));
+ PublicContentChangedEvent event = new PublicContentChangedEvent(JacmsSystemConstants.CONTENT_EVENT_CHANNEL, properties);
+ // setContent is deprecated but must still be set: SeoMappingManager discards the event
+ // when getContent() is null, while the search engine only needs the contentId.
+ event.setContent(content);
+ event.setOperationCode(operationCode);
+ this.notifyEvent(event);
+ }
+
private void flushGroups(String contentId, String typeCode) {
String[] groups = (null != typeCode) ? CmsCacheWrapperManager.getContentCacheGroupsToEvict(contentId, typeCode) : CmsCacheWrapperManager.getContentCacheGroupsToEvict(contentId);
for (int i = 0; i < groups.length; i++) {
diff --git a/contentscheduler-plugin/src/main/resources/spring/plugins/jpcontentscheduler/aps/contentThreadConfig.xml b/contentscheduler-plugin/src/main/resources/spring/plugins/jpcontentscheduler/aps/contentThreadConfig.xml
index a32ddc94bb..5aa175701f 100644
--- a/contentscheduler-plugin/src/main/resources/spring/plugins/jpcontentscheduler/aps/contentThreadConfig.xml
+++ b/contentscheduler-plugin/src/main/resources/spring/plugins/jpcontentscheduler/aps/contentThreadConfig.xml
@@ -7,8 +7,10 @@
-
+
+
diff --git a/contentscheduler-plugin/src/main/webapp/WEB-INF/plugins/jpcontentscheduler/apsadmin/jsp/config/entryContentTypes.jsp b/contentscheduler-plugin/src/main/webapp/WEB-INF/plugins/jpcontentscheduler/apsadmin/jsp/config/entryContentTypes.jsp
index 0971302f17..4aa158fc18 100644
--- a/contentscheduler-plugin/src/main/webapp/WEB-INF/plugins/jpcontentscheduler/apsadmin/jsp/config/entryContentTypes.jsp
+++ b/contentscheduler-plugin/src/main/webapp/WEB-INF/plugins/jpcontentscheduler/apsadmin/jsp/config/entryContentTypes.jsp
@@ -176,6 +176,10 @@
+ <%-- An unchecked box would submit nothing and leave
+ 'suspend' null instead of "false". The marker below lets the 'checkbox'
+ interceptor inject the unchecked value. --%>
+
diff --git a/contentscheduler-plugin/src/test/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/ContentSchedulerManagerTest.java b/contentscheduler-plugin/src/test/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/ContentSchedulerManagerTest.java
new file mode 100644
index 0000000000..e968a2a578
--- /dev/null
+++ b/contentscheduler-plugin/src/test/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/ContentSchedulerManagerTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2017-Present Entando Inc. (http://www.entando.com) All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.entando.entando.plugins.jpcontentscheduler.aps.system.services.content;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.agiletec.aps.system.common.notify.INotifyManager;
+import com.agiletec.aps.system.services.keygenerator.IKeyGeneratorManager;
+import com.agiletec.plugins.jacms.aps.system.JacmsSystemConstants;
+import com.agiletec.plugins.jacms.aps.system.services.content.event.PublicContentChangedEvent;
+import com.agiletec.plugins.jacms.aps.system.services.content.model.Content;
+import org.entando.entando.aps.system.services.cache.ICacheInfoManager;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * The scheduler publishes contents through the core ContentManager, which notifies the
+ * PublicContentChangedEvent on its own, but it unpublishes and archives them through its
+ * own manager: these tests cover the notifications that manager has to send by itself,
+ * otherwise the search engine indexes keep the unpublished contents (ECS-596).
+ */
+@ExtendWith(MockitoExtension.class)
+class ContentSchedulerManagerTest {
+
+ private static final String CONTENT_ID = "ART123";
+ private static final String TYPE_CODE = "ART";
+
+ @Mock
+ private IContentSchedulerDAO contentSchedulerDAO;
+ @Mock
+ private INotifyManager notifyManager;
+ @Mock
+ private ICacheInfoManager cacheInfoManager;
+ @Mock
+ private IKeyGeneratorManager keyGeneratorManager;
+
+ @Captor
+ private ArgumentCaptor eventCaptor;
+
+ private ContentSchedulerManager contentSchedulerManager;
+
+ @BeforeEach
+ void setUp() {
+ this.contentSchedulerManager = new ContentSchedulerManager();
+ this.contentSchedulerManager.setContentSchedulerDAO(this.contentSchedulerDAO);
+ this.contentSchedulerManager.setNotifyManager(this.notifyManager);
+ this.contentSchedulerManager.setCacheInfoManager(this.cacheInfoManager);
+ this.contentSchedulerManager.setKeyGeneratorManager(this.keyGeneratorManager);
+ }
+
+ @Test
+ void removeOnLineContentShouldNotifyTheRemoveOperation() throws Exception {
+ Content content = this.createContent(true, Content.STATUS_PUBLIC);
+
+ this.contentSchedulerManager.removeOnLineContent(content, false);
+
+ verify(this.contentSchedulerDAO).unpublishOnLineContent(content);
+ PublicContentChangedEvent event = this.captureNotifiedEvent();
+ assertEquals(PublicContentChangedEvent.REMOVE_OPERATION_CODE, event.getOperationCode());
+ assertEquals(CONTENT_ID, event.getContentId());
+ assertEquals(Content.STATUS_READY, content.getStatus());
+ }
+
+ @Test
+ void notifiedEventShouldBeAddressedToTheContentChannel() throws Exception {
+ Content content = this.createContent(true, Content.STATUS_PUBLIC);
+
+ this.contentSchedulerManager.removeOnLineContent(content, false);
+
+ // RedisNotifyManager republishes an event only when both channel and message are
+ // set, so a bare "new PublicContentChangedEvent()" would never leave the instance.
+ PublicContentChangedEvent event = this.captureNotifiedEvent();
+ assertEquals(JacmsSystemConstants.CONTENT_EVENT_CHANNEL, event.getChannel());
+ assertNotNull(event.getMessage());
+ assertTrue(event.getMessage().contains(CONTENT_ID));
+ assertTrue(event.getMessage().contains(String.valueOf(PublicContentChangedEvent.REMOVE_OPERATION_CODE)));
+ }
+
+ @Test
+ @SuppressWarnings("deprecation")
+ void notifiedEventShouldCarryTheContentObject() throws Exception {
+ Content content = this.createContent(true, Content.STATUS_PUBLIC);
+
+ this.contentSchedulerManager.removeOnLineContent(content, false);
+
+ // SeoMappingManager discards the event when getContent() is null, so the
+ // deprecated content object has to be set as ContentManager does.
+ assertEquals(content, this.captureNotifiedEvent().getContent());
+ }
+
+ @Test
+ void moveOnLineContentShouldNotifyTheUpdateOperationForAPublishedContent() throws Exception {
+ Content content = this.createContent(true, Content.STATUS_PUBLIC);
+
+ this.contentSchedulerManager.moveOnLineContent(content, false, false);
+
+ verify(this.contentSchedulerDAO).updateContent(content, false);
+ verify(this.contentSchedulerDAO).publishContent(content);
+ PublicContentChangedEvent event = this.captureNotifiedEvent();
+ assertEquals(PublicContentChangedEvent.UPDATE_OPERATION_CODE, event.getOperationCode());
+ assertEquals(CONTENT_ID, event.getContentId());
+ }
+
+ @Test
+ void moveOnLineContentShouldNotifyTheInsertOperationForAnUnpublishedContent() throws Exception {
+ Content content = this.createContent(false, Content.STATUS_READY);
+
+ this.contentSchedulerManager.moveOnLineContent(content, false, false);
+
+ assertEquals(PublicContentChangedEvent.INSERT_OPERATION_CODE,
+ this.captureNotifiedEvent().getOperationCode());
+ }
+
+ @Test
+ void moveOnLineContentShouldNotNotifyWhenTheContentIsJustCreated() throws Exception {
+ when(this.keyGeneratorManager.getUniqueKeyCurrentValue()).thenReturn(99);
+ Content content = this.createContent(false, Content.STATUS_READY);
+ content.setId(null);
+
+ this.contentSchedulerManager.moveOnLineContent(content, false, false);
+
+ // Nothing gets published here: the content is only added to the work version.
+ assertEquals(TYPE_CODE + "99", content.getId());
+ verify(this.contentSchedulerDAO).addEntity(content);
+ verify(this.notifyManager, never()).publishEvent(any());
+ }
+
+ private Content createContent(boolean onLine, String status) {
+ Content content = new Content();
+ content.setId(CONTENT_ID);
+ content.setTypeCode(TYPE_CODE);
+ content.setDescription("test content");
+ content.setStatus(status);
+ content.setOnLine(onLine);
+ return content;
+ }
+
+ private PublicContentChangedEvent captureNotifiedEvent() {
+ verify(this.notifyManager).publishEvent(this.eventCaptor.capture());
+ return assertInstanceOf(PublicContentChangedEvent.class, this.eventCaptor.getValue());
+ }
+
+}
\ No newline at end of file
diff --git a/contentscheduler-plugin/src/test/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/parse/ContentThreadConfigDOMTest.java b/contentscheduler-plugin/src/test/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/parse/ContentThreadConfigDOMTest.java
new file mode 100644
index 0000000000..5ff9158ae9
--- /dev/null
+++ b/contentscheduler-plugin/src/test/java/org/entando/entando/plugins/jpcontentscheduler/aps/system/services/content/parse/ContentThreadConfigDOMTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2017-Present Entando Inc. (http://www.entando.com) All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.entando.entando.plugins.jpcontentscheduler.aps.system.services.content.parse;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import org.entando.entando.plugins.jpcontentscheduler.aps.system.services.content.model.ContentThreadConfig;
+import org.entando.entando.plugins.jpcontentscheduler.aps.system.services.content.model.ContentTypeElem;
+import org.junit.jupiter.api.Test;
+
+/**
+ * The "suspend" flag drives the action performed at the end date: "true" unpublishes the
+ * content, "false" moves it to the online archive. Both values have to survive the write
+ * and read of the cthread_config item, otherwise the content type is silently skipped.
+ */
+class ContentThreadConfigDOMTest {
+
+ private static final String CONFIG_RESOURCE = "liquibase/jpcontentscheduler/port/clob/test/cthread_config.xml";
+ private static final String TYPE_CODE = "NOL";
+
+ @Test
+ void suspendTrueShouldSurviveTheConfigRoundTrip() throws Exception {
+ ContentThreadConfigDOM dom = new ContentThreadConfigDOM();
+ ContentThreadConfig config = dom.extractConfig(this.readSeedConfig());
+ assertEquals("true", this.getType(config, TYPE_CODE).getSuspend());
+
+ ContentThreadConfig reloaded = dom.extractConfig(dom.createConfigXml(config));
+
+ assertEquals("true", this.getType(reloaded, TYPE_CODE).getSuspend());
+ }
+
+ @Test
+ void suspendFalseShouldSurviveTheConfigRoundTrip() throws Exception {
+ ContentThreadConfigDOM dom = new ContentThreadConfigDOM();
+ ContentThreadConfig config = dom.extractConfig(this.readSeedConfig());
+ this.getType(config, TYPE_CODE).setSuspend("false");
+
+ ContentThreadConfig reloaded = dom.extractConfig(dom.createConfigXml(config));
+
+ assertEquals("false", this.getType(reloaded, TYPE_CODE).getSuspend());
+ }
+
+ @Test
+ void aNullSuspendShouldBeReadBackAsBlank() throws Exception {
+ ContentThreadConfigDOM dom = new ContentThreadConfigDOM();
+ ContentThreadConfig config = dom.extractConfig(this.readSeedConfig());
+ this.getType(config, TYPE_CODE).setSuspend(null);
+
+ ContentThreadConfig reloaded = dom.extractConfig(dom.createConfigXml(config));
+
+ // safeSetAttr() drops null values, so the attribute never reaches the xml and the
+ // content type ends up doing nothing at the end date: this is why the admin form
+ // has to submit an explicit "false" for an unchecked box.
+ assertEquals("", this.getType(reloaded, TYPE_CODE).getSuspend());
+ }
+
+ private String readSeedConfig() throws IOException {
+ try (InputStream is = this.getClass().getClassLoader().getResourceAsStream(CONFIG_RESOURCE)) {
+ assertNotNull(is, "Missing test resource " + CONFIG_RESOURCE);
+ return new String(is.readAllBytes(), StandardCharsets.UTF_8);
+ }
+ }
+
+ private ContentTypeElem getType(ContentThreadConfig config, String typeCode) {
+ return config.getTypesList().stream()
+ .filter(elem -> typeCode.equals(elem.getContentType()))
+ .findFirst()
+ .orElseThrow(() -> new AssertionError("Content type not configured: " + typeCode));
+ }
+
+}
\ No newline at end of file
diff --git a/contentworkflow-plugin/pom.xml b/contentworkflow-plugin/pom.xml
index 7b0d97306d..d5538c6108 100644
--- a/contentworkflow-plugin/pom.xml
+++ b/contentworkflow-plugin/pom.xml
@@ -5,7 +5,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpcontentworkfloworg.entando.entando.plugins
diff --git a/engine/pom.xml b/engine/pom.xml
index 9b465efb9b..9e354a8e9f 100644
--- a/engine/pom.xml
+++ b/engine/pom.xml
@@ -4,7 +4,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTorg.entando.entandoentando-engine
diff --git a/keycloak-plugin/pom.xml b/keycloak-plugin/pom.xml
index 231cb1b9d8..b495a82680 100644
--- a/keycloak-plugin/pom.xml
+++ b/keycloak-plugin/pom.xml
@@ -5,7 +5,7 @@
app-engineorg.entando
- 7.5.2
+ 7.5.3-SNAPSHOTorg.entando.entandoentando-keycloak-auth
diff --git a/mail-plugin/pom.xml b/mail-plugin/pom.xml
index 8636c79ae9..5cf045407d 100644
--- a/mail-plugin/pom.xml
+++ b/mail-plugin/pom.xml
@@ -4,7 +4,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpmailorg.entando.entando.plugins
diff --git a/pom.xml b/pom.xml
index 78b1a987e2..d86af76b91 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTpom
diff --git a/portal-ui/pom.xml b/portal-ui/pom.xml
index d21d373a8f..6defec2cc2 100644
--- a/portal-ui/pom.xml
+++ b/portal-ui/pom.xml
@@ -4,7 +4,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTorg.entando.entandoentando-portal-ui
diff --git a/redis-plugin/pom.xml b/redis-plugin/pom.xml
index 4e7748dca0..c3b2b69f74 100644
--- a/redis-plugin/pom.xml
+++ b/redis-plugin/pom.xml
@@ -5,7 +5,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpredisorg.entando.entando.plugins
diff --git a/seo-plugin/pom.xml b/seo-plugin/pom.xml
index 9466ece9fa..6f769b63b4 100644
--- a/seo-plugin/pom.xml
+++ b/seo-plugin/pom.xml
@@ -4,7 +4,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpseoorg.entando.entando.plugins
diff --git a/solr-plugin/pom.xml b/solr-plugin/pom.xml
index 62e989efe2..2cd34bceae 100644
--- a/solr-plugin/pom.xml
+++ b/solr-plugin/pom.xml
@@ -5,7 +5,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpsolrorg.entando.entando.plugins
diff --git a/versioning-plugin/pom.xml b/versioning-plugin/pom.xml
index bf5bd844cf..acf1e91d4a 100644
--- a/versioning-plugin/pom.xml
+++ b/versioning-plugin/pom.xml
@@ -4,7 +4,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTentando-plugin-jpversioningorg.entando.entando.plugins
diff --git a/webapp/pom.xml b/webapp/pom.xml
index 10d9be2970..fdaa47ac86 100644
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -5,7 +5,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTorg.entando.entandowebapp
diff --git a/webdynamicform-plugin/pom.xml b/webdynamicform-plugin/pom.xml
index 08c7a577a7..63944fb42e 100644
--- a/webdynamicform-plugin/pom.xml
+++ b/webdynamicform-plugin/pom.xml
@@ -5,7 +5,7 @@
org.entandoapp-engine
- 7.5.2
+ 7.5.3-SNAPSHOTorg.entando.entando.pluginsentando-plugin-jpwebdynamicform