diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemManager.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemManager.java index 1fffa72bf..8cf5b8b09 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemManager.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemManager.java @@ -705,13 +705,41 @@ public class ContentItemManager { * @param item */ @Transactional(Transactional.TxType.REQUIRED) - public void unpublish(final ContentItem item - ) { + public void unpublish(final ContentItem item) { + if (item == null) { + throw new IllegalArgumentException( + "The item to unpublish can't be null"); + } + + LOGGER.debug("Unpublishing item {}...", item.getItemUuid()); + final Optional liveItem = getLiveVersion( item, ContentItem.class); + if (!liveItem.isPresent()) { + LOGGER.info("ContentItem {} has no live version.", + item.getItemUuid()); + return; + } + + final List categories = liveItem + .get() + .getCategories() + .stream() + .map(categorization -> categorization.getCategory()) + .collect(Collectors.toList()); + + categories.forEach(category -> { + try { + categoryManager.removeObjectFromCategory(liveItem.get(), + category); + } catch (ObjectNotAssignedToCategoryException ex) { + throw new RuntimeException(ex); + } + }); + if (liveItem.isPresent()) { - entityManager.remove(liveItem); + entityManager.remove(liveItem.get()); } } @@ -727,7 +755,7 @@ public class ContentItemManager { public boolean isLive(final ContentItem item) { final TypedQuery query = entityManager.createNamedQuery( "ContentItem.hasLiveVersion", Boolean.class); - query.setParameter("uuid", item.getUuid()); + query.setParameter("uuid", item.getItemUuid()); return query.getSingleResult(); } @@ -744,16 +772,31 @@ public class ContentItemManager { * version is returned. If there is no live version an empty * {@link Optional} is returned. */ + @SuppressWarnings({"unchecked"}) public Optional getLiveVersion( final ContentItem item, final Class type) { + if (!ContentItem.class.isAssignableFrom(type)) { + throw new IllegalArgumentException(String.format( + "The provided type \"%s\" does match the type of the provided " + + "item (\"%s\").", + type.getName(), + item.getClass().getName())); + } + if (isLive(item)) { - final TypedQuery query = entityManager.createNamedQuery( - "ContentItem.findLiveVersion", type); - query.setParameter("uuid", item.getUuid()); + final TypedQuery query = entityManager + .createNamedQuery( + "ContentItem.findLiveVersion", ContentItem.class); + query.setParameter("uuid", item.getItemUuid()); - return Optional.of(query.getSingleResult()); + final ContentItem result = query.getSingleResult(); + if (type.isAssignableFrom(result.getClass())) { + return Optional.of((T) result); + } else { + return Optional.empty(); + } } else { return Optional.empty(); } @@ -801,7 +844,7 @@ public class ContentItemManager { final TypedQuery query = entityManager.createNamedQuery( "ContentItem.findDraftVersion", ContentItem.class); - query.setParameter("uuid", item.getUuid()); + query.setParameter("uuid", item.getItemUuid()); return (T) query.getSingleResult(); } diff --git a/ccm-cms/src/test/java/org/librecms/contentsection/ContentItemManagerTest.java b/ccm-cms/src/test/java/org/librecms/contentsection/ContentItemManagerTest.java index 6c8a91819..3ccb7e858 100644 --- a/ccm-cms/src/test/java/org/librecms/contentsection/ContentItemManagerTest.java +++ b/ccm-cms/src/test/java/org/librecms/contentsection/ContentItemManagerTest.java @@ -711,7 +711,7 @@ public class ContentItemManagerTest { public void publishItemNull() { itemManager.publish(null); } - + @Test(expected = IllegalArgumentException.class) @InSequence(5500) @UsingDataSet("datasets/org/librecms/contentsection/" @@ -721,15 +721,167 @@ public class ContentItemManagerTest { @ShouldThrowException(IllegalArgumentException.class) public void publishItemLifecycleNull() { final Optional draft = itemRepo.findById(-10200L); - + itemManager.publish(draft.get(), null); } - // unpublish item - // unpublish non live - // unpublish item null - // isLive - // isDraft - // getLiveVersion + @Test + @InSequence(6000) + @UsingDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + @ShouldMatchDataSet( + value = "datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/after-unpublish.xml", + excludeColumns = {"categorization_id", + "id", + "lifecycle_id", + "object_id", + "object_order", + "phase_id", + "rev", + "revend", + "task_id", + "timestamp", + "uuid", + "workflow_id"}) + public void unpublishItem() { + final Optional item = itemRepo.findById(-10200L); + assertThat(item.isPresent(), is(true)); + + itemManager.unpublish(item.get()); + } + + @Test + @InSequence(6100) + @UsingDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + @ShouldMatchDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + public void unpublishNonLiveItem() { + final Optional item = itemRepo.findById(-10300L); + assertThat(item.isPresent(), is(true)); + + itemManager.unpublish(item.get()); + } + + @Test(expected = IllegalArgumentException.class) + @InSequence(6200) + @UsingDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + @ShouldMatchDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + @ShouldThrowException(IllegalArgumentException.class) + public void unpublishItemNull() { + itemManager.unpublish(null); + } + + @Test + @InSequence(7000) + @UsingDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + @ShouldMatchDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + public void isLive() { + final Optional item1 = itemRepo.findById(-10100L); + final Optional item2 = itemRepo.findById(-10200L); + final Optional item3 = itemRepo.findById(-10300L); + final Optional item4 = itemRepo.findById(-10400L); + + assertThat(item1.isPresent(), is(true)); + assertThat(item2.isPresent(), is(true)); + assertThat(item3.isPresent(), is(true)); + assertThat(item4.isPresent(), is(true)); + + assertThat(itemManager.isLive(item1.get()), is(false)); + assertThat(itemManager.isLive(item2.get()), is(true)); + assertThat(itemManager.isLive(item3.get()), is(false)); + assertThat(itemManager.isLive(item4.get()), is(false)); + } + + @Test + @InSequence(8000) + @UsingDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + @ShouldMatchDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + public void getLiveVersion() { + final Optional draft1 = itemRepo.findById(-10100L); + final Optional draft2 = itemRepo.findById(-10200L); + final Optional draft3 = itemRepo.findById(-10300L); + final Optional draft4 = itemRepo.findById(-10400L); + + final Optional live2 = itemRepo.findById(-99200L); + + assertThat(itemManager.getLiveVersion(draft1.get(), + ContentItem.class).isPresent(), + is(false)); + final Optional
liveVersion = itemManager.getLiveVersion( + draft2.get(), Article.class); + assertThat(liveVersion.isPresent(), + is(true)); + assertThat(liveVersion.get().getObjectId(), + is(-99200L)); + assertThat(liveVersion.get().getItemUuid(), + is(equalTo("acae860f-2ffa-450d-b486-054292f0dae6"))); + assertThat(liveVersion.get().getVersion(), + is(ContentItemVersion.LIVE)); + assertThat(itemManager.getLiveVersion(draft3.get(), + ContentItem.class).isPresent(), + is(false)); + assertThat(itemManager.getLiveVersion(draft4.get(), + ContentItem.class).isPresent(), + is(false)); + + final Optional fromLive = itemManager.getLiveVersion( + live2.get(), ContentItem.class); + assertThat(fromLive.isPresent(), + is(true)); + assertThat(fromLive.get().getObjectId(), + is(-99200L)); + assertThat(fromLive.get().getItemUuid(), + is(equalTo("acae860f-2ffa-450d-b486-054292f0dae6"))); + assertThat(fromLive.get().getVersion(), + is(ContentItemVersion.LIVE)); + } + + @Test + @InSequence(8100) + @UsingDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") + @ShouldMatchDataSet("datasets/org/librecms/contentsection/" + + "ContentItemManagerTest/data.xml") // getDraftVersion + public void getDraftVersion() { + final Optional draft1 = itemRepo.findById(-10100L); + final Optional draft2 = itemRepo.findById(-10200L); + final Optional draft3 = itemRepo.findById(-10300L); + final Optional draft4 = itemRepo.findById(-10400L); + + assertThat(itemManager.getDraftVersion(draft1.get(), + ContentItem.class).getObjectId(), + is(-10100L)); + assertThat(itemManager.getDraftVersion(draft2.get(), + ContentItem.class).getObjectId(), + is(-10200L)); + assertThat(itemManager.getDraftVersion(draft3.get(), + ContentItem.class).getObjectId(), + is(-10300L)); + assertThat(itemManager.getDraftVersion(draft4.get(), + ContentItem.class).getObjectId(), + is(-10400L)); + + final Optional live2 = itemRepo.findById(-99200L); + + final ContentItem draftVersion = itemManager.getDraftVersion( + live2.get(), ContentItem.class); + + assertThat(draftVersion, is(not(nullValue()))); + assertThat(draftVersion.getObjectId(), is(-10200L)); + assertThat(draftVersion.getItemUuid(), + is(equalTo("acae860f-2ffa-450d-b486-054292f0dae6"))); + assertThat(draftVersion.getVersion(), + is(ContentItemVersion.DRAFT)); + + } + } diff --git a/ccm-cms/src/test/java/org/librecms/contentsection/DatasetsTest.java b/ccm-cms/src/test/java/org/librecms/contentsection/DatasetsTest.java index b787cf82c..c7835d7f7 100644 --- a/ccm-cms/src/test/java/org/librecms/contentsection/DatasetsTest.java +++ b/ccm-cms/src/test/java/org/librecms/contentsection/DatasetsTest.java @@ -59,7 +59,8 @@ public class DatasetsTest extends DatasetsVerifier { "/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-other-folder.xml", "/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-same-folder.xml", "/datasets/org/librecms/contentsection/ContentItemManagerTest/after-publish.xml", - "/datasets/org/librecms/contentsection/ContentItemManagerTest/after-republish.xml"}); + "/datasets/org/librecms/contentsection/ContentItemManagerTest/after-republish.xml", + "/datasets/org/librecms/contentsection/ContentItemManagerTest/after-unpublish.xml"}); } public DatasetsTest(final String datasetPath) { diff --git a/ccm-cms/src/test/resources-wildfly-remote-h2-mem/arquillian.xml b/ccm-cms/src/test/resources-wildfly-remote-h2-mem/arquillian.xml index fea7e023a..043eae21f 100644 --- a/ccm-cms/src/test/resources-wildfly-remote-h2-mem/arquillian.xml +++ b/ccm-cms/src/test/resources-wildfly-remote-h2-mem/arquillian.xml @@ -32,9 +32,9 @@ true - + diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-unpublish.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-unpublish.xml new file mode 100644 index 000000000..010d0a6ed --- /dev/null +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-unpublish.xml @@ -0,0 +1,660 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +