diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/AttachmentList.java b/ccm-cms/src/main/java/org/librecms/contentsection/AttachmentList.java index 372a0227d..d76f065d5 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/AttachmentList.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/AttachmentList.java @@ -139,6 +139,12 @@ public class AttachmentList implements Comparable, @OneToMany(mappedBy = "attachmentList") private List> attachments; + public AttachmentList() { + title = new LocalizedString(); + description = new LocalizedString(); + attachments = new ArrayList<>(); + } + public long getListId() { return listId; } 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 37bdb613b..e681738bd 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemManager.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemManager.java @@ -19,6 +19,7 @@ package org.librecms.contentsection; import com.arsdigita.kernel.KernelConfig; +import com.arsdigita.util.UncheckedWrapperException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -59,8 +60,11 @@ import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.UUID; +import java.util.logging.Level; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; @@ -107,6 +111,9 @@ public class ContentItemManager { @Inject private FolderRepository folderRepo; + @Inject + private AssetManager assetManager; + /** * Creates a new content item in the provided content section and folder * with the workflow. @@ -327,7 +334,7 @@ public class ContentItemManager { final ContentItem item, @RequiresPrivilege(ItemPrivileges.CREATE_NEW) final Folder targetFolder) { - + if (item == null) { throw new IllegalArgumentException("The item to copy can't be null."); } @@ -339,8 +346,7 @@ public class ContentItemManager { final Optional contentType = typeRepo .findByContentSectionAndClass( - item.getContentType().getContentSection(), item. - getClass()); + targetFolder.getSection(), item.getClass()); if (!contentType.isPresent()) { throw new IllegalArgumentException(String.format( @@ -404,11 +410,10 @@ public class ContentItemManager { targetFolder, CATEGORIZATION_TYPE_FOLDER); - // !!!!!!!!!!!!!!!!!!!!! - // ToDo copy Attachments - // !!!!!!!!!!!!!!!!!!!!! - // - // + for (AttachmentList attachmentList : item.getAttachments()) { + copyAttachmentList(attachmentList, copy); + } + final BeanInfo beanInfo; try { beanInfo = Introspector.getBeanInfo(item.getClass()); @@ -541,9 +546,13 @@ public class ContentItemManager { private boolean propertyIsExcluded(final String name) { final String[] excluded = new String[]{ - "objectId", "uuid", "lifecycle", "workflow", "categories", - "attachments" - }; + "attachments", + "categories", + "contentType", + "lifecycle", + "objectId", + "uuid", + "workflow",}; boolean result = false; for (final String current : excluded) { @@ -555,6 +564,125 @@ public class ContentItemManager { return result; } + private void copyAttachmentList(final AttachmentList list, + final ContentItem target) { + final AttachmentList targetList = new AttachmentList(); + for (final Locale locale : list.getDescription().getAvailableLocales()) { + targetList.getDescription().addValue( + locale, list.getDescription().getValue(locale)); + } + targetList.setItem(target); + targetList.setName(list.getName()); + targetList.setOrder(list.getOrder()); + for (Map.Entry title : list.getTitle().getValues() + .entrySet()) { + targetList.getTitle().addValue(title.getKey(), title.getValue()); + } + targetList.setUuid(UUID.randomUUID().toString()); + + entityManager.persist(list); + + for (ItemAttachment attachment : list.getAttachments()) { + if (assetManager.isShared(attachment.getAsset())) { + copySharedAssetAttachment(attachment, targetList); + } else { + copyAssetAttachment(attachment, targetList); + } + } + + entityManager.merge(list); + } + + private void copySharedAssetAttachment(final ItemAttachment attachment, + final AttachmentList target) { + final ItemAttachment itemAttachment = new ItemAttachment<>(); + itemAttachment.setAsset(attachment.getAsset()); + itemAttachment.setAttachmentList(target); + itemAttachment.setSortKey(attachment.getSortKey()); + itemAttachment.setUuid(UUID.randomUUID().toString()); + + entityManager.persist(itemAttachment); + target.addAttachment(itemAttachment); + entityManager.merge(target); + } + + private void copyAssetAttachment(final ItemAttachment attachment, + final AttachmentList targetList) { + final Asset source = attachment.getAsset(); + final Asset target; + try { + target = source.getClass().newInstance(); + } catch (InstantiationException | IllegalAccessException ex) { + throw new UncheckedWrapperException(ex); + } + + final BeanInfo beanInfo; + try { + beanInfo = Introspector.getBeanInfo(source.getClass()); + } catch (IntrospectionException ex) { + throw new UncheckedWrapperException(ex); + } + + for (final PropertyDescriptor propertyDescriptor : beanInfo + .getPropertyDescriptors()) { + final String propertyName = propertyDescriptor.getName(); + if ("objectId".equals(propertyName) + || "uuid".equals(propertyName) + || "itemAttachments".equals(propertyName) + || "categories".equals(propertyName)) { + continue; + } + + final Class propType = propertyDescriptor.getPropertyType(); + final Method readMethod = propertyDescriptor.getReadMethod(); + final Method writeMethod = propertyDescriptor.getWriteMethod(); + + if (writeMethod == null) { + continue; + } + + if (LocalizedString.class.equals(propType)) { + final LocalizedString sourceStr; + final LocalizedString targetStr; + try { + sourceStr = (LocalizedString) readMethod.invoke(source); + targetStr = (LocalizedString) readMethod.invoke(target); + } catch (IllegalAccessException + | IllegalArgumentException + | InvocationTargetException ex) { + throw new UncheckedWrapperException(ex); + } + + sourceStr.getAvailableLocales().forEach( + locale -> targetStr.addValue(locale, + sourceStr.getValue(locale))); + } else { + final Object value; + try { + value = readMethod.invoke(source); + writeMethod.invoke(target, value); + } catch (IllegalAccessException + | IllegalArgumentException + | InvocationTargetException ex) { + throw new UncheckedWrapperException(ex); + } + } + } + + target.setUuid(UUID.randomUUID().toString()); + + entityManager.persist(target); + final ItemAttachment targetAttachment = new ItemAttachment<>(); + targetAttachment.setAsset(target); + targetAttachment.setSortKey(attachment.getSortKey()); + targetAttachment.setUuid(UUID.randomUUID().toString()); + entityManager.persist(targetAttachment); + + targetAttachment.setAttachmentList(targetList); + targetList.addAttachment(targetAttachment); + entityManager.merge(targetAttachment); + } + /** * Creates a live version of content item or updates the live version of a * content item if there already a live version using the default lifecycle @@ -613,14 +741,17 @@ public class ContentItemManager { final ContentItem liveItem; if (isLive(item)) { - liveItem = getLiveVersion(item, ContentItem.class).get(); - } else { - try { - liveItem = draftItem.getClass().newInstance(); - } catch (InstantiationException | IllegalAccessException ex) { - throw new RuntimeException(ex); - } + final ContentItem oldLiveItem = getLiveVersion( + item, ContentItem.class).get(); + unpublish(oldLiveItem); } +// else { + try { + liveItem = draftItem.getClass().newInstance(); + } catch (InstantiationException | IllegalAccessException ex) { + throw new RuntimeException(ex); + } +// } liveItem.setVersion(ContentItemVersion.PUBLISHING); liveItem.setItemUuid(draftItem.getItemUuid()); @@ -650,11 +781,10 @@ public class ContentItemManager { categorization.getCategory(), categorization.getType())); - // !!!!!!!!!!!!!!!!!!!!! - // ToDo copy Attachments - // !!!!!!!!!!!!!!!!!!!!! - // - // + for (AttachmentList attachmentList : item.getAttachments()) { + copyAttachmentList(attachmentList, liveItem); + } + final BeanInfo beanInfo; try { beanInfo = Introspector.getBeanInfo(item.getClass()); @@ -833,6 +963,15 @@ public class ContentItemManager { return; } + final List attachmentLists = liveItem.get() + .getAttachments(); + for (final AttachmentList attachmentList : attachmentLists) { + attachmentList.getAttachments().forEach( + attachment -> { + unpublishAttachment(attachment); + }); + } + final List categories = liveItem .get() .getCategories() @@ -855,6 +994,21 @@ public class ContentItemManager { } + private void unpublishAttachment(final ItemAttachment itemAttachment) { + final Asset asset = itemAttachment.getAsset(); + + asset.removeItemAttachment(itemAttachment); + itemAttachment.setAsset(null); + + if (assetManager.isShared(asset)) { + entityManager.merge(asset); + } else { + entityManager.remove(asset); + } + + entityManager.remove(itemAttachment); + } + /** * Unpublishes all live items in a folder. Items in sub folders will * not be unpublished!. @@ -1157,5 +1311,5 @@ public class ContentItemManager { return Optional.empty(); } } - + } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ItemAttachment.java b/ccm-cms/src/main/java/org/librecms/contentsection/ItemAttachment.java index f723b0a1b..460333e82 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ItemAttachment.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ItemAttachment.java @@ -24,6 +24,7 @@ import org.libreccm.core.Identifiable; import java.io.Serializable; import java.util.Objects; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -85,7 +86,7 @@ public class ItemAttachment /** * The {@link AttachmentList} to which this attachment belongs. */ - @ManyToOne + @ManyToOne(cascade = {CascadeType.PERSIST}) @JoinColumn(name = "ATTACHMENT_LIST_ID") private AttachmentList attachmentList; @@ -93,7 +94,8 @@ public class ItemAttachment * The {@link Asset} which is linked by this attachment to the * {@link #attachmentList}. */ - @ManyToOne(targetEntity = Asset.class) + @ManyToOne(targetEntity = Asset.class, + cascade = {CascadeType.PERSIST}) @JoinColumn(name = "ASSET_ID") private T asset; 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 3a1674292..e591a1829 100644 --- a/ccm-cms/src/test/java/org/librecms/contentsection/ContentItemManagerTest.java +++ b/ccm-cms/src/test/java/org/librecms/contentsection/ContentItemManagerTest.java @@ -60,7 +60,7 @@ import static org.libreccm.testutils.DependenciesHelpers.*; /** * Tests for the {@link ContentItemManager}. - * + * * @author Jens Pelzetter */ @org.junit.experimental.categories.Category(IntegrationTest.class) @@ -154,6 +154,7 @@ public class ContentItemManagerTest { .addPackage(org.librecms.contentsection.Asset.class.getPackage()) .addPackage(org.librecms.contentsection.AttachmentList.class .getPackage()) + .addPackage(org.librecms.assets.BinaryAsset.class.getPackage()) .addPackage(org.librecms.lifecycle.Lifecycle.class.getPackage()) .addPackage(org.librecms.contentsection.ContentSection.class .getPackage()) @@ -534,19 +535,18 @@ public class ContentItemManagerTest { "uuid", "workflow_id" }) - public void moveToOtherContentSection() { + public void moveItemToOtherContentSection() { final Optional item = itemRepo.findById(-10100L); final Folder targetFolder = folderRepo.findById(-2300L); - + assertThat(item.isPresent(), is(true)); assertThat(targetFolder, is(not(nullValue()))); - + itemManager.move(item.get(), targetFolder); } - /** - * Verifies that - * {@link ContentItemManager#move(org.librecms.contentsection.ContentItem, org.librecms.contentsection.Folder) + /** + * Verifies that {@link ContentItemManager#move(org.librecms.contentsection.ContentItem, org.librecms.contentsection.Folder) * throws an {@link IllegalArgumentException} if the type of the item to * copy has not been registered in content section to which the target * folder belongs. @@ -554,21 +554,20 @@ public class ContentItemManagerTest { @Test(expected = IllegalArgumentException.class) @InSequence(4120) @UsingDataSet("datasets/org/librecms/contentsection/" - + "ContentItemManagerTest/data.xml") + + "ContentItemManagerTest/data.xml") @ShouldMatchDataSet("datasets/org/librecms/contentsection/" - + "ContentItemManagerTest/data.xml") + + "ContentItemManagerTest/data.xml") @ShouldThrowException(IllegalArgumentException.class) public void moveToOtherContentSectionTypeNotPresent() { final Optional item = itemRepo.findById(-10400L); final Folder targetFolder = folderRepo.findById(-2300L); - + assertThat(item.isPresent(), is(true)); assertThat(targetFolder, is(not(nullValue()))); - + itemManager.move(item.get(), targetFolder); } - /** * Verifies that * {@link ContentItemManager#move(org.librecms.contentsection.ContentItem, org.librecms.contentsection.Folder)} @@ -620,14 +619,18 @@ public class ContentItemManagerTest { @ShouldMatchDataSet( value = "datasets/org/librecms/contentsection/" + "ContentItemManagerTest/after-copy-to-other-folder.xml", - excludeColumns = {"categorization_id", + excludeColumns = {"asset_id", + "attachment_id", + "attachment_list_id", + "categorization_id", "id", + "item_id", "item_uuid", "lifecycle_id", + "list_id", "object_id", "object_order", "phase_id", - "rev", "task_id", "uuid", "timestamp", @@ -654,28 +657,32 @@ public class ContentItemManagerTest { @ShouldMatchDataSet( value = "datasets/org/librecms/contentsection/" + "ContentItemManagerTest/after-copy-to-folder-in-other-section.xml", - excludeColumns = {"categorization_id", - "content_type_id", + excludeColumns = {"asset_id", + "attachment_id", + "attachment_list_id", + "categorization_id", "id", + "item_id", "item_uuid", "lifecycle_id", + "list_id", "object_id", "object_order", "phase_id", - "rev", "task_id", "uuid", "timestamp", - "workflow_id"}) + "workflow_id" + }) public void copyToFolderInOtherSection() { final Optional source = itemRepo.findById(-10100L); final Folder targetFolder = folderRepo.findById(-2300L); - + assertThat(source.isPresent(), is(true)); assertThat(targetFolder, is(not(nullValue()))); - + final ContentItem target = itemManager.copy(source.get(), targetFolder); - + assertThat(target.getUuid(), is(not(equalTo(source.get().getUuid())))); assertThat(target.getItemUuid(), is(equalTo(target.getUuid()))); } @@ -690,17 +697,17 @@ public class ContentItemManagerTest { @Test(expected = IllegalArgumentException.class) @InSequence(4120) @UsingDataSet("datasets/org/librecms/contentsection/" - + "ContentItemManagerTest/data.xml") + + "ContentItemManagerTest/data.xml") @ShouldMatchDataSet("datasets/org/librecms/contentsection/" - + "ContentItemManagerTest/data.xml") + + "ContentItemManagerTest/data.xml") @ShouldThrowException(IllegalArgumentException.class) public void copyToFolderInOtherSectionTypeNotPresent() { final Optional source = itemRepo.findById(-10400L); final Folder targetFolder = folderRepo.findById(-2300L); - + assertThat(source.isPresent(), is(true)); assertThat(targetFolder, is(not(nullValue()))); - + itemManager.copy(source.get(), targetFolder); } @@ -717,17 +724,21 @@ public class ContentItemManagerTest { @ShouldMatchDataSet( value = "datasets/org/librecms/contentsection/" + "ContentItemManagerTest/after-copy-to-same-folder.xml", - excludeColumns = {"categorization_id", + excludeColumns = {"asset_id", + "attachment_id", + "attachment_list_id", + "categorization_id", "id", + "item_id", "item_uuid", "lifecycle_id", + "list_id", "object_id", "object_order", "phase_id", - "rev", "task_id", - "timestamp", "uuid", + "timestamp", "workflow_id" }) public void copyToSameFolder() { @@ -796,16 +807,21 @@ public class ContentItemManagerTest { @ShouldMatchDataSet( value = "datasets/org/librecms/contentsection/" + "ContentItemManagerTest/after-publish.xml", - excludeColumns = {"categorization_id", + excludeColumns = {"asset_id", + "attachment_id", + "attachment_list_id", + "categorization_id", "id", + "item_id", + "item_uuid", "lifecycle_id", + "list_id", "object_id", "object_order", "phase_id", - "rev", "task_id", - "timestamp", "uuid", + "timestamp", "workflow_id" }) public void publishItem() { @@ -831,16 +847,21 @@ public class ContentItemManagerTest { @ShouldMatchDataSet( value = "datasets/org/librecms/contentsection/" + "ContentItemManagerTest/after-publish.xml", - excludeColumns = {"categorization_id", + excludeColumns = {"asset_id", + "attachment_id", + "attachment_list_id", + "categorization_id", "id", + "item_id", + "item_uuid", "lifecycle_id", + "list_id", "object_id", "object_order", "phase_id", - "rev", "task_id", - "timestamp", "uuid", + "timestamp", "workflow_id" }) public void publishItemWithLifecycle() { @@ -868,12 +889,11 @@ public class ContentItemManagerTest { + "ContentItemManagerTest/after-republish.xml", excludeColumns = {"categorization_id", "id", + "item_uuid", "lifecycle_id", "object_id", "object_order", "phase_id", - "rev", - "revend", "task_id", "timestamp", "uuid", diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-folder-in-other-section.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-folder-in-other-section.xml index 2c9c7c6d1..73568414a 100644 --- a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-folder-in-other-section.xml +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-folder-in-other-section.xml @@ -91,7 +91,7 @@ - + + + - + + + + + content_type_id="-20300" /> - - - - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-other-folder.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-other-folder.xml index 7f23586d7..cc4f1c346 100644 --- a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-other-folder.xml +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-other-folder.xml @@ -142,9 +142,18 @@ + + + + + + + @@ -420,7 +446,7 @@ localized_value="news1" locale="en" revtype="0" /> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-same-folder.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-same-folder.xml index ef2eff62b..4754921df 100644 --- a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-same-folder.xml +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-copy-to-same-folder.xml @@ -91,10 +91,9 @@ - - @@ -143,9 +142,18 @@ + + + + + + + @@ -420,7 +445,7 @@ localized_value="news1" locale="en" revtype="0" /> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem-with-workflow.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem-with-workflow.xml index 3adb86207..f3728356a 100644 --- a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem-with-workflow.xml +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem-with-workflow.xml @@ -153,7 +153,7 @@ - + + @@ -190,6 +196,14 @@ revtype="0" display_name="news1" /> + + @@ -358,7 +372,7 @@ item_uuid="d9ea527d-c6e3-4bdd-962d-c0a1a80c6c72" version="DRAFT" content_type_id="-20200" /> - - - @@ -501,7 +515,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem.xml index 126a4e8bc..c931845c9 100644 --- a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem.xml +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-create-contentitem.xml @@ -166,7 +166,7 @@ - + + @@ -203,6 +209,14 @@ revtype="0" display_name="news1" /> + + @@ -371,7 +385,7 @@ item_uuid="d9ea527d-c6e3-4bdd-962d-c0a1a80c6c72" version="DRAFT" content_type_id="-20200" /> - - - @@ -514,7 +528,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-move-to-other-section.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-move-to-other-section.xml index 77a6f583d..14dc8b7d2 100644 --- a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-move-to-other-section.xml +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-move-to-other-section.xml @@ -137,6 +137,12 @@ + + @@ -161,6 +167,14 @@ rev="0" revtype="0" display_name="news1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -161,6 +167,14 @@ rev="0" revtype="0" display_name="news1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -749,10 +846,10 @@ creation_date="2016-07-15"/> + granted_privilege="categorize_items" + object_id="-2300" + grantee_id="-3200" + creation_date="2016-07-15"/> + + + + + + + + locale="en" + localized_value="projects" /> + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-republish.xml b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-republish.xml index a4c6d8e3e..95d621ae0 100644 --- a/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-republish.xml +++ b/ccm-cms/src/test/resources/datasets/org/librecms/contentsection/ContentItemManagerTest/after-republish.xml @@ -140,6 +140,12 @@ + + @@ -151,12 +157,12 @@ + + rev="6" + revtype="2" /> + + + @@ -405,7 +424,7 @@ object_id="-10200" localized_value="article2" locale="en" - revend="1" + revend="6" revtype="0" /> - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -163,6 +169,14 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -161,6 +167,14 @@ rev="0" revtype="0" display_name="news1" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +