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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT org.entando.entando entando-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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpcds org.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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT org.entando.entando.plugins entando-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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpcontentscheduler org.entando.entando.plugins @@ -154,6 +154,10 @@ org.junit.jupiter junit-jupiter-api + + org.mockito + mockito-junit-jupiter + org.apache.derby derby 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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpcontentworkflow org.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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT org.entando.entando entando-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-engine org.entando - 7.5.2 + 7.5.3-SNAPSHOT org.entando.entando entando-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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpmail org.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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT pom 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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT org.entando.entando entando-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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpredis org.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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpseo org.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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpsolr org.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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT entando-plugin-jpversioning org.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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT org.entando.entando webapp 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.entando app-engine - 7.5.2 + 7.5.3-SNAPSHOT org.entando.entando.plugins entando-plugin-jpwebdynamicform