diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/dispatcher/Utilities.java b/ccm-cms/src/main/java/com/arsdigita/cms/dispatcher/Utilities.java index 12b689433..b577f3810 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/dispatcher/Utilities.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/dispatcher/Utilities.java @@ -110,7 +110,7 @@ public class Utilities { * @deprecated Use Service.getAssetURL(BinaryAsset asset) instead */ public static String getAssetURL(BinaryAsset asset) { - return getAssetURL(asset.getAssetId()); + return getAssetURL(asset.getObjectId()); } /** @@ -131,7 +131,7 @@ public class Utilities { /** - * Constuct a URL which serves an image. + * Construct a URL which serves an image. * * @param asset The image asset whose image is to be served * @return the URL which will serve the specified image asset @@ -141,7 +141,7 @@ public class Utilities { // StringBuffer buf = new StringBuffer(getServiceURL()); StringBuilder buf = new StringBuilder(CmsConstants.SERVICE_URL ); buf.append("stream/image/?"); - buf.append(CmsConstants.IMAGE_ID).append("=").append(asset.getAssetId()); + buf.append(CmsConstants.IMAGE_ID).append("=").append(asset.getObjectId()); return buf.toString(); } diff --git a/ccm-cms/src/main/java/org/librecms/assets/Asset.java b/ccm-cms/src/main/java/org/librecms/assets/Asset.java index e60be1054..0dd987458 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/Asset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/Asset.java @@ -19,30 +19,37 @@ package org.librecms.assets; import org.hibernate.envers.Audited; -import org.libreccm.core.Identifiable; +import org.libreccm.categorization.Categorization; +import org.libreccm.core.CcmObject; import org.libreccm.l10n.LocalizedString; +import org.libreccm.security.InheritsPermissions; +import org.librecms.CmsConstants; +import org.librecms.attachments.ItemAttachment; -import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Objects; +import java.util.Optional; import javax.persistence.AssociationOverride; -import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; +import javax.persistence.OneToMany; import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** + * Base class for all assets providing common fields. This class is + * not indented for direct use. Only to sub classes should be + * used. * * @author Jens Pelzetter */ @@ -52,26 +59,23 @@ import static org.librecms.CmsConstants.*; @Audited @NamedQueries({ @NamedQuery(name = "Asset.findByUuid", - query = "SELECT a FROM Asset a WHERE a.uuid = :uuid"), + query = "SELECT a FROM Asset a WHERE a.uuid = :uuid") + , @NamedQuery(name = "Asset.findByType", query = "SELECT a FROM Asset a " - + "WHERE TYPE(a) = :type"), + + "WHERE TYPE(a) = :type") + , @NamedQuery(name = "Asset.findByUuidAndType", query = "SELECT a FROM Asset a " + "WHERE a.uuid = :uuid " + "AND TYPE(a) = :type") }) -public class Asset implements Identifiable, Serializable { +public class Asset extends CcmObject implements InheritsPermissions { private static final long serialVersionUID = -3499741368562653529L; - @Column(name = "ASSET_ID") - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private long assetId; - - @Column(name = "UUID", unique = true) - private String uuid; + @OneToMany(mappedBy = "asset") + private List> itemAttachments; @Embedded @AssociationOverride( @@ -89,23 +93,6 @@ public class Asset implements Identifiable, Serializable { title = new LocalizedString(); } - public long getAssetId() { - return assetId; - } - - protected void setAssetId(final long assetId) { - this.assetId = assetId; - } - - @Override - public String getUuid() { - return uuid; - } - - public void setUuid(final String uuid) { - this.uuid = uuid; - } - public LocalizedString getTitle() { return title; } @@ -114,20 +101,62 @@ public class Asset implements Identifiable, Serializable { this.title = title; } + public List> getItemAttachments() { + if (itemAttachments == null) { + return new ArrayList<>(); + } else { + return Collections.unmodifiableList(itemAttachments); + } + } + + @Override + public Optional getParent() { + // For sharable assets the parent is the folder in the asset is stored + final Optional folder = getFolder(); + if (folder.isPresent()) { + return folder; + } + + if (itemAttachments == null || itemAttachments.isEmpty()) { + return Optional.empty(); + } else { + return Optional.of(itemAttachments.get(0).getAttachmentList() + .getItem()); + } + + } + + private Optional getFolder() { + final Optional result = getCategories() + .stream() + .filter(categorization -> CmsConstants.CATEGORIZATION_TYPE_FOLDER + .equals(categorization.getType())) + .findFirst(); + + if (result.isPresent()) { + return Optional.of(result.get().getCategory()); + } else { + return Optional.empty(); + } + } + @Override public int hashCode() { - int hash = 3; - hash = 97 * hash + (int) (assetId ^ (assetId >>> 32)); - hash = 97 * hash + Objects.hashCode(uuid); + int hash = super.hashCode(); hash = 97 * hash + Objects.hashCode(title); return hash; } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } + + if (!super.equals(obj)) { + return false; + } + if (obj == null) { return false; } @@ -138,37 +167,19 @@ public class Asset implements Identifiable, Serializable { if (!other.canEqual(this)) { return false; } - - if (assetId != other.getAssetId()) { - return false; - } - if (!Objects.equals(uuid, other.getUuid())) { - return false; - } return Objects.equals(title, other.getTitle()); } + @Override public boolean canEqual(final Object obj) { return obj instanceof Asset; } @Override - public final String toString() { - return toString(""); - } - public String toString(final String data) { - return String.format( - "%s{ " - + "assetIdd = %d, " - + "uuid = %s, " - + "title = {}%s" - + " }", - super.toString(), - assetId, - uuid, - Objects.toString(title), - data); + return super.toString(String.format(", title = \"%s\"%s", + title, + data)); } } diff --git a/ccm-cms/src/main/java/org/librecms/assets/AssetRepository.java b/ccm-cms/src/main/java/org/librecms/assets/AssetRepository.java index 7cc18b744..6a2116a7a 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/AssetRepository.java +++ b/ccm-cms/src/main/java/org/librecms/assets/AssetRepository.java @@ -39,7 +39,7 @@ public class AssetRepository @Override public Long getEntityId(final Asset asset) { - return asset.getAssetId(); + return asset.getObjectId(); } @Override @@ -49,7 +49,7 @@ public class AssetRepository @Override public boolean isNew(final Asset asset) { - return asset.getAssetId() == 0; + return asset.getObjectId() == 0; } public Optional findByUuid(final String uuid) { diff --git a/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java b/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java index b4f7550bd..a0763e874 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java @@ -31,7 +31,8 @@ import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** - * + * An asset for audio files, for example podcasts of music. + * * @author Jens Pelzetter */ @Entity diff --git a/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java b/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java index acf245fda..8a60767c5 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java @@ -42,7 +42,8 @@ import javax.persistence.Convert; import static org.librecms.CmsConstants.*; /** - * + * Base class for all assets storing binary information, like videos. + * * @author Jens Pelzetter */ @Entity diff --git a/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java b/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java index 615ae92bb..7113db48c 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java +++ b/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java @@ -35,7 +35,9 @@ import org.libreccm.l10n.LocalizedString; import static org.librecms.CmsConstants.*; /** - * + * An assets for managing bookmarks which can be used to create links. Useful + * if the same link appears in multiple places. + * * @author Jens Pelzetter */ @Entity diff --git a/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java b/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java index fe7869536..ed64f5676 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java @@ -31,6 +31,9 @@ import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** + * An asset for an external audio file (an audio file which is + * not + * stored in the database of LibreCCM. * * @author Jens Pelzetter */ diff --git a/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java b/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java index 12b96fc62..bdff1cff6 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java @@ -31,11 +31,12 @@ import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** - * + * An asset for external videos, like videos from YouTube. + * * @author Jens Pelzetter */ @Entity -@Table(name = "EXTERNAL_VIDEO_ASSET", schema = DB_SCHEMA) +@Table(name = "EXTERNAL_VIDEO_ASSETS", schema = DB_SCHEMA) @Audited public class ExternalVideoAsset extends Bookmark implements Serializable { diff --git a/ccm-cms/src/main/java/org/librecms/assets/File.java b/ccm-cms/src/main/java/org/librecms/assets/File.java index f85f4bbc8..4caec5012 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/File.java +++ b/ccm-cms/src/main/java/org/librecms/assets/File.java @@ -25,7 +25,8 @@ import org.hibernate.envers.Audited; import static org.librecms.CmsConstants.*; /** - * + * An asset for making files available for download. + * * @author Jens Pelzetter */ @Entity @@ -55,7 +56,7 @@ public class File extends BinaryAsset implements Serializable { if (!(obj instanceof File)) { return false; } - final BinaryAsset other = (File) obj; + final File other = (File) obj; return other.canEqual(this); } diff --git a/ccm-cms/src/main/java/org/librecms/assets/Image.java b/ccm-cms/src/main/java/org/librecms/assets/Image.java index 868a150ab..db9637637 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/Image.java +++ b/ccm-cms/src/main/java/org/librecms/assets/Image.java @@ -33,6 +33,8 @@ import javax.persistence.OneToOne; import static org.librecms.CmsConstants.*; /** + * An asset for images (in a format which can be displayed by a browser, like + * PNG, JPEG or GIF). * * @author Jens Pelzetter */ diff --git a/ccm-cms/src/main/java/org/librecms/assets/ReusableAsset.java b/ccm-cms/src/main/java/org/librecms/assets/ReusableAsset.java deleted file mode 100644 index e22bca41a..000000000 --- a/ccm-cms/src/main/java/org/librecms/assets/ReusableAsset.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2016 LibreCCM Foundation. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ -package org.librecms.assets; - -import org.hibernate.envers.Audited; -import org.libreccm.core.CcmObject; - -import java.io.Serializable; -import java.util.Objects; - -import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; -import javax.persistence.Table; - -import static org.librecms.CmsConstants.*; - -/** - * - * @author Jens Pelzetter - * @param - */ -@Entity -@Table(schema = DB_SCHEMA, name = "REUSABLE_ASSETS") -@Audited -public class ReusableAsset extends CcmObject - implements Serializable { - - private static final long serialVersionUID = 1341326042963088198L; - - @OneToOne(targetEntity = Asset.class) - @JoinColumn(name = "ASSET_ID") - private T asset; - - public T getAsset() { - return asset; - } - - protected void setAsset(final T asset) { - this.asset = asset; - } - - @Override - public int hashCode() { - int hash = super.hashCode(); - hash = 11 * hash + Objects.hashCode(asset); - return hash; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (!super.equals(obj)) { - return false; - } - if (!(obj instanceof ReusableAsset)) { - return false; - } - final ReusableAsset other = (ReusableAsset) obj; - if (!other.canEqual(obj)) { - return false; - } - - return Objects.equals(asset, other.getAsset()); - } - - @Override - public boolean canEqual(final Object obj) { - return obj instanceof ReusableAsset; - } - - @Override - public String toString(final String data) { - return super.toString(String.format( - ", asset = { %s }%s", - Objects.toString(asset), - data - )); - } - -} diff --git a/ccm-cms/src/main/java/org/librecms/assets/Note.java b/ccm-cms/src/main/java/org/librecms/assets/SideNote.java similarity index 87% rename from ccm-cms/src/main/java/org/librecms/assets/Note.java rename to ccm-cms/src/main/java/org/librecms/assets/SideNote.java index 4045aaf87..52925c48b 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/Note.java +++ b/ccm-cms/src/main/java/org/librecms/assets/SideNote.java @@ -34,20 +34,21 @@ import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** - * + * Assets for side notes (additional informations) for a content item. + * * @author Jens Pelzetter */ @Entity -@Table(name = "NOTES", schema = DB_SCHEMA) +@Table(name = "SIDE_NOTES", schema = DB_SCHEMA) @Audited -public class Note extends Asset implements Serializable { +public class SideNote extends Asset implements Serializable { private static final long serialVersionUID = -4566222634780521726L; @Embedded @AssociationOverride( name = "values", - joinTable = @JoinTable(name = "NOTE_TEXTS", + joinTable = @JoinTable(name = "SIDE_NOTE_TEXTS", schema = DB_SCHEMA, joinColumns = { @JoinColumn(name = "ASSET_ID") @@ -56,7 +57,7 @@ public class Note extends Asset implements Serializable { ) private LocalizedString text; - public Note() { + public SideNote() { super(); text = new LocalizedString(); } @@ -88,10 +89,10 @@ public class Note extends Asset implements Serializable { return false; } - if (!(obj instanceof Note)) { + if (!(obj instanceof SideNote)) { return false; } - final Note other = (Note) obj; + final SideNote other = (SideNote) obj; if (!other.canEqual(this)) { return false; } @@ -100,7 +101,7 @@ public class Note extends Asset implements Serializable { @Override public boolean canEqual(final Object obj) { - return obj instanceof Note; + return obj instanceof SideNote; } @Override diff --git a/ccm-cms/src/main/java/org/librecms/assets/VideoAsset.java b/ccm-cms/src/main/java/org/librecms/assets/VideoAsset.java index 0c7d12a0d..d587c5690 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/VideoAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/VideoAsset.java @@ -32,11 +32,12 @@ import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** - * + * An asset for videos. + * * @author Jens Pelzetter */ @Entity -@Table(name = "VIDEO_ASSET", schema = DB_SCHEMA) +@Table(name = "VIDEO_ASSETS", schema = DB_SCHEMA) @Audited public class VideoAsset extends BinaryAsset implements Serializable { diff --git a/ccm-cms/src/main/java/org/librecms/assets/package-info.java b/ccm-cms/src/main/java/org/librecms/assets/package-info.java new file mode 100644 index 000000000..3696f81dd --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/assets/package-info.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2016 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +/** + * This package contains several classes for assets. Assets are containers + * for information which can be used as addendum for {@link ContentItem}s. They + * are also used for media content like images, videos or files + * like PDFs. Assets are may or may not be reusable. Reusable assets are managed + * inside special folders for each content section. If a asset from one content + * section can be used in another content section depends on the permissions + * of the author of a content item. + */ +package org.librecms.assets; diff --git a/ccm-cms/src/main/java/org/librecms/attachments/AttachmentList.java b/ccm-cms/src/main/java/org/librecms/attachments/AttachmentList.java index 63550e423..65aee5e19 100644 --- a/ccm-cms/src/main/java/org/librecms/attachments/AttachmentList.java +++ b/ccm-cms/src/main/java/org/librecms/attachments/AttachmentList.java @@ -21,15 +21,12 @@ package org.librecms.attachments; import org.hibernate.envers.Audited; import org.libreccm.core.Identifiable; import org.libreccm.l10n.LocalizedString; -import org.librecms.assets.Asset; +import org.librecms.contentsection.ContentItem; import java.io.Serializable; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; -import java.util.Iterator; import java.util.List; -import java.util.ListIterator; import java.util.Objects; import javax.persistence.AssociationOverride; @@ -41,33 +38,57 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; +import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** - * + * A list of assets attached a {@link ContentItem}. Each {@link ContentItem} + * may have multiple lists of attachments. Each list can be identified by name + * which can be used for example by the theme to determine the position where + * the list is printed. + * * @author Jens Pelzetter - * @param */ @Entity -@Table(schema = DB_SCHEMA, name = "ATTACHMENT_LISTS") +@Table(name = "ATTACHMENT_LISTS", schema = DB_SCHEMA) @Audited -public class AttachmentList implements Identifiable, - List>, - Serializable { - - private static final long serialVersionUID = -7750330135750750047L; +public class AttachmentList implements Identifiable, Serializable { + private static final long serialVersionUID = -7931234562247075541L; + + /** + * Database ID of the list entity. + */ @Column(name = "LIST_ID") @Id @GeneratedValue(strategy = GenerationType.AUTO) private long listId; + /** + * UUID of the list. + */ @Column(name = "UUID") private String uuid; + /** + * The {@link ContentItem} which owns this list. + */ + @ManyToOne + @JoinColumn(name = "ITEM_ID") + private ContentItem item; + + /** + * The name of the list. + */ + @Column(name = "NAME") + private String name; + + /** + * The localised title of the list. + */ @Embedded @AssociationOverride( name = "values", @@ -78,20 +99,29 @@ public class AttachmentList implements Identifiable, } ) ) - private LocalizedString caption; + private LocalizedString title; - @Column(name = "ASSET_TYPE", length = 1024) - private String assetType; + /** + * The description of the list. + */ + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable(name = "ATTACHMENT_LIST_DESCRIPTIONS", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "LIST_ID") + })) + private LocalizedString description; - @OneToMany(targetEntity = ItemAttachment.class) - @JoinColumn(name = "LIST_ID") - private List> attachments; + @OneToMany(mappedBy = "attachmentList") + private List> attachments; public long getListId() { return listId; } - protected void setListId(final long listId) { + public void setListId(long listId) { this.listId = listId; } @@ -104,170 +134,74 @@ public class AttachmentList implements Identifiable, this.uuid = uuid; } - public LocalizedString getCaption() { - return caption; + public ContentItem getItem() { + return item; } - public void setCaption(final LocalizedString caption) { - this.caption = caption; + public void setItem(final ContentItem item) { + this.item = item; } - public String getAssetType() { - return assetType; + public String getName() { + return name; } - public void setAssetType(final String assetType) { - this.assetType = assetType; + public void setName(final String name) { + this.name = name; } - public List> getAttachments() { + public LocalizedString getTitle() { + return title; + } + + public void setTitle(final LocalizedString title) { + this.title = title; + } + + public LocalizedString getDescription() { + return description; + } + + public void setDescription(final LocalizedString description) { + this.description = description; + } + + public List> getAttachments() { if (attachments == null) { - return null; + return new ArrayList<>(); } else { return Collections.unmodifiableList(attachments); } } - public void setAttachments(List> attachments) { - this.attachments = new ArrayList<>(attachments); + protected void setAttachments(final List> attachments) { + this.attachments = Collections.unmodifiableList(attachments); } - @Override - public int size() { - return attachments.size(); + protected void addAttachment(final ItemAttachment attachment) { + attachments.add(attachment); } - @Override - public boolean isEmpty() { - return attachments.isEmpty(); - } - - @Override - public boolean contains(final Object obj) { - return attachments.contains(obj); - } - - @Override - public Iterator> iterator() { - return attachments.iterator(); - } - - @Override - public Object[] toArray() { - return attachments.toArray(); - } - - @Override - public T[] toArray(final T[] array) { - return attachments.toArray(array); - } - - @Override - public boolean add(final ItemAttachment attachment) { - return attachments.add(attachment); - } - - @Override - public boolean remove(final Object obj) { - return attachments.remove(obj); - } - - @Override - public boolean containsAll(final Collection collection) { - return attachments.containsAll(collection); - } - - @Override - public boolean addAll( - final Collection> collection) { - - return attachments.addAll(collection); - } - - @Override - public boolean addAll( - final int index, - final Collection> collection) { - - return attachments.addAll(index, collection); - } - - @Override - public boolean removeAll(final Collection collection) { - return attachments.removeAll(collection); - } - - @Override - public boolean retainAll(final Collection collection) { - return attachments.retainAll(collection); - } - - @Override - public void clear() { - attachments.clear(); - } - - @Override - public ItemAttachment get(final int index) { - return attachments.get(index); - } - - @Override - public ItemAttachment set(final int index, - final ItemAttachment element) { - return attachments.set(index, element); - } - - @Override - public void add(final int index, final ItemAttachment element) { - attachments.add(index, element); - } - - @Override - public ItemAttachment remove(final int index) { - return attachments.remove(index); - } - - @Override - public int indexOf(final Object obj) { - return attachments.indexOf(obj); - } - - @Override - public int lastIndexOf(final Object obj) { - return attachments.lastIndexOf(obj); - } - - @Override - public ListIterator> listIterator() { - return attachments.listIterator(); - } - - @Override - public ListIterator> listIterator(final int index) { - return attachments.listIterator(index); - } - - @Override - public List> subList(final int fromIndex, - final int toIndex) { - return attachments.subList(fromIndex, toIndex); + protected void removeAttachment(final ItemAttachment attachment) { + attachments.remove(attachment); } @Override public int hashCode() { - int hash = 7; - hash = 97 * hash + (int) (listId ^ (listId >>> 32)); - hash = 97 * hash + Objects.hashCode(uuid); - hash = 97 * hash + Objects.hashCode(caption); - hash = 97 * hash + Objects.hashCode(assetType); - hash = 97 * hash + Objects.hashCode(attachments); + int hash = 3; + hash = 29 * hash + (int) (listId ^ (listId >>> 32)); + hash = 29 * hash + Objects.hashCode(uuid); + hash = 29 * hash + Objects.hashCode(name); + hash = 29 * hash + Objects.hashCode(title); + hash = 29 * hash + Objects.hashCode(description); + hash = 29 * hash + Objects.hashCode(attachments); return hash; } @Override public boolean equals(final Object obj) { if (this == obj) { + return true; } if (obj == null) { @@ -276,23 +210,37 @@ public class AttachmentList implements Identifiable, if (!(obj instanceof AttachmentList)) { return false; } - final AttachmentList other = (AttachmentList) obj; + final AttachmentList other = (AttachmentList) obj; if (!other.canEqual(this)) { + System.out.println("Same object"); return false; } + if (listId != other.getListId()) { + System.out.println("list ids are not equal"); return false; } if (!Objects.equals(uuid, other.getUuid())) { + System.out.println("uuid is not equal"); return false; } - if (!Objects.equals(caption, other.getCaption())) { + if (!Objects.equals(name, other.getName())) { + System.out.println("name is not equal"); return false; } - if (!Objects.equals(assetType, other.getAssetType())) { + if (!Objects.equals(title, other.getTitle())) { + System.out.println("caption is not equal"); return false; } - return Objects.equals(attachments, other.getAttachments()); + if (!Objects.equals(description, other.getDescription())) { + System.out.println("description is not equal"); + return false; + } + System.out.printf("attachments{%s}.equals({%s}) = %b\n", + Objects.toString(attachments), + Objects.toString(other.getAttachments()), + Objects.equals(attachments, other.getAttachments())); + return Objects.equals(getAttachments(), other.getAttachments()); } public boolean canEqual(final Object obj) { @@ -308,15 +256,17 @@ public class AttachmentList implements Identifiable, return String.format("%s{ " + "listId = %d, " + "uuid = %s, " + + "name = \"%s\", " + "caption = { %s }, " - + "assetType = %s, " + + "description = { %s }, " + "attachments = { %s }%s" + " }", super.toString(), listId, uuid, - Objects.toString(caption), - assetType, + name, + Objects.toString(title), + Objects.toString(description), Objects.toString(attachments), data); } diff --git a/ccm-cms/src/main/java/org/librecms/attachments/AttachmentsConfig.java b/ccm-cms/src/main/java/org/librecms/attachments/AttachmentsConfig.java new file mode 100644 index 000000000..7549d25ae --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/attachments/AttachmentsConfig.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2016 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.attachments; + +import org.libreccm.configuration.Configuration; +import org.libreccm.configuration.Setting; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * Special configuration parameters for attachments. + * + * @author Jens Pelzetter + */ +@Configuration +public class AttachmentsConfig { + + /** + * Possible names for an {@link AttachmentList} from which the authors can + * choose. + */ + @Setting + private List attachmentListNames = Arrays.asList(new String[]{}); + + public List getAttachmentListNames() { + if (attachmentListNames == null) { + return new ArrayList<>(); + } else { + return new ArrayList<>(attachmentListNames); + } + } + + public void setAttachmentListNames(final List attachmentListNames) { + this.attachmentListNames = new ArrayList<>(attachmentListNames); + } + + @Override + public int hashCode() { + int hash = 3; + hash = 79 * hash + Objects.hashCode(attachmentListNames); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof AttachmentsConfig)) { + return false; + } + final AttachmentsConfig other = (AttachmentsConfig) obj; + if (!other.canEqual(this)) { + return false; + } + + return Objects.equals(getAttachmentListNames(), + other.getAttachmentListNames()); + } + + public boolean canEqual(final Object obj) { + return obj instanceof AttachmentsConfig; + } + + @Override + public final String toString() { + return toString(""); + } + + public String toString(final String data) { + return String.format("%s{ " + + "attachmentListNames = { %s }%d" + + " }", + Objects.toString(attachmentListNames), + super.toString()); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/attachments/ItemAttachment.java b/ccm-cms/src/main/java/org/librecms/attachments/ItemAttachment.java index 03b036b72..d3dc9812b 100644 --- a/ccm-cms/src/main/java/org/librecms/attachments/ItemAttachment.java +++ b/ccm-cms/src/main/java/org/librecms/attachments/ItemAttachment.java @@ -31,12 +31,14 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; -import javax.persistence.OneToOne; +import javax.persistence.ManyToOne; import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** + * An intermediate entity to model the relation between an {@link Asset} (either + * shared or not shared) and an {@link AttachmentList}. * * @author Jens Pelzetter * @param @@ -49,18 +51,38 @@ public class ItemAttachment implements Identifiable, private static final long serialVersionUID = -9005379413315191984L; + /** + * The ID of the attachment entity in the database. + */ @Column(name = "ATTACHMENT_ID") @Id @GeneratedValue(strategy = GenerationType.AUTO) private long attachmentId; + /** + * UUID of the attachment. + */ @Column(name = "uuid") private String uuid; - @OneToOne(targetEntity = Asset.class) + /** + * The {@link AttachmentList} to which this attachment belongs. + */ + @ManyToOne + @JoinColumn(name = "ATTACHMENT_LIST_ID") + private AttachmentList attachmentList; + + /** + * The {@link Asset} which is linked by this attachment to the + * {@link #attachmentList}. + */ + @ManyToOne(targetEntity = Asset.class) @JoinColumn(name = "ASSET_ID") private T asset; + /** + * The sort key of this attachment in {@link #attachmentList}. + */ @Column(name = "SORT_KEY") private long sortKey; @@ -81,6 +103,14 @@ public class ItemAttachment implements Identifiable, this.uuid = uuid; } + public AttachmentList getAttachmentList() { + return attachmentList; + } + + protected void setAttachmentList(final AttachmentList attachmentList) { + this.attachmentList = attachmentList; + } + public T getAsset() { return asset; } @@ -102,6 +132,7 @@ public class ItemAttachment implements Identifiable, int hash = 3; hash = 71 * hash + (int) (attachmentId ^ (attachmentId >>> 32)); + hash = 71 * hash + Objects.hashCode(uuid); hash = 71 * hash + Objects.hashCode(asset); hash = 71 * hash + (int) (sortKey ^ (sortKey >>> 32)); return hash; @@ -125,6 +156,9 @@ public class ItemAttachment implements Identifiable, if (attachmentId != other.getAttachmentId()) { return false; } + if (!Objects.equals(uuid, other.getUuid())) { + return false; + } if (sortKey != other.getSortKey()) { return false; } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java index 060e4024c..2d64742ff 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java @@ -205,7 +205,7 @@ public class ContentItem extends CcmObject implements Serializable, @OneToMany @JoinColumn(name = "CONTENT_ITEM_ID") - private List> attachments; + private List attachments; @OneToOne @JoinColumn(name = "LIFECYCLE_ID") @@ -296,13 +296,21 @@ public class ContentItem extends CcmObject implements Serializable, this.ancestors = ancestors; } - public List> getAttachments() { + public List getAttachments() { return Collections.unmodifiableList(attachments); } - protected void setAttachments(final List> attachments) { + protected void setAttachments(final List attachments) { this.attachments = attachments; } + + protected void addAttachmentList(final AttachmentList attachmentList) { + attachments.add(attachmentList); + } + + protected void removeAttachmentList(final AttachmentList attachmentList) { + attachments.remove(attachmentList); + } public Lifecycle getLifecycle() { return lifecycle; diff --git a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_8__update_assets_and_attachments.sql b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_8__update_assets_and_attachments.sql new file mode 100644 index 000000000..447bf1cce --- /dev/null +++ b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_8__update_assets_and_attachments.sql @@ -0,0 +1,396 @@ +alter table CCM_CMS.ASSETS + drop constraint UK_9l2v1u9beyemgjwqx7isbumwh; + +alter table CCM_CMS.ASSETS_AUD + drop constraint FK4m4op9s9h5qhndcsssbu55gr2; + +alter table CCM_CMS.AttachmentList_ItemAttachment_AUD + drop constraint FKduowjilu7dqfs2oja88tr5oim; + +alter table CCM_CMS.AttachmentList_ItemAttachment_AUD + drop constraint FKdtm7qp3n6cojbm9b916plsgtx; + +alter table CCM_CMS.ASSETS_AUD + drop constraint FK586j3p95nw2oa6yd06xdw0o5u; + +alter table CCM_CMS.ATTACHMENTS + drop constraint FK622uanry14vw27de3d2v9uy57; + +alter table CCM_CMS.ASSETS + alter column ASSET_ID rename to OBJECT_ID; + +alter table CCM_CMS.ASSETS + drop column if exists UUID; + +alter table CCM_CMS.ASSETS_AUD + alter column ASSET_ID rename to object_id; + +alter table CCM_CMS.ASSETS_AUD + drop column if exists revtype; + +alter table CCM_CMS.ASSETS_AUD + drop column if exists revend; + +alter table CCM_CMS.ASSETS_AUD + drop column if exists uuid; + +alter table CCM_CMS.BOOKMARKS + drop constraint FKhs1tohpjry5sqdpl3cijl5ppk; + +alter table CCM_CMS.BOOKMARKS_AUD + drop constraint FKjrk2tah1gyn67acth3g7olvuc; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS + drop constraint FK5sxviewjxfgk0at60emrpuh3n; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS_AUD + drop constraint FK6814o1fnh49p5ij9cfvr7y00s; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET + drop constraint FKc6m77lkbfa5ym2s8sq00jkyjf; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET_AUD + drop constraint FKd5efitnmsrko2vq48ei1mclfv; + +alter table CCM_CMS.FILES + drop constraint FK4e8p3tu8ocy43ofs9uifuk8gh; + +alter table CCM_CMS.FILES_AUD + drop constraint FK3c9xf8w1dr3q0grxslguvviqn; + +alter table CCM_CMS.IMAGES + drop constraint FK9mgknvtu1crw4el5d4sqy8d6c; + +alter table CCM_CMS.IMAGES_AUD + drop constraint FK6xggeoexci2har3mceo9naqiy; + +alter table CCM_CMS.LEGAL_METADATA + drop constraint FKjxss2fb6khhn68e8ccuksl9hk; + +alter table CCM_CMS.LEGAL_METADATA_AUD + drop constraint FKofjkwpepeyb6e8tytnhjfvx49; + +alter table CCM_CMS.NOTE_TEXTS + drop constraint FKa0yp21m25o7omtnag0eet8v8q; + +alter table CCM_CMS.RELATED_LINKS + drop constraint FKf4r30ra4a2ajuky0tk4lc06n5; + +alter table CCM_CMS.RELATED_LINKS_AUD + drop constraint FKkda2cf5ynu7v7udi0ytfmr9ij; + +alter table CCM_CMS.REUSABLE_ASSETS + drop constraint FKngdq6f077q6ndqn9o3jc6k14a; + +alter table CCM_CMS.REUSABLE_ASSETS + drop constraint FKhvf4mfltp8abbr5u0qgjm2jk2; + +alter table CCM_CMS.REUSABLE_ASSETS_AUD + drop constraint FKgyc5gd3cffox4wvjoir6i4gxt; + +alter table CCM_CMS.VIDEO_ASSET + drop constraint FKdjjbp8p48xwfqhw0oo79tkyjy; + +alter table CCM_CMS.VIDEO_ASSET + drop constraint FK9cynf36vykykyaga2j1xs7jkx; + +alter table CCM_CMS.VIDEO_ASSET_AUD + drop constraint FK7qsbfxxg6ixpkjjor4nbkd63i; + +create table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS ( + LIST_ID bigint not null, + LOCALIZED_VALUE longvarchar, + LOCALE varchar(255) not null, + primary key (LIST_ID, LOCALE) +); + +create table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS_AUD ( + REV integer not null, + LIST_ID bigint not null, + LOCALIZED_VALUE longvarchar not null, + LOCALE varchar(255) not null, + REVTYPE tinyint, + REVEND integer, + primary key (REV, LIST_ID, LOCALIZED_VALUE, LOCALE) +); + +alter table CCM_CMS.ATTACHMENT_LISTS + drop column asset_type; + +alter table CCM_CMS.ATTACHMENT_LISTS + add column NAME varchar(255); + +alter table CCM_CMS.ATTACHMENT_LISTS + add column ITEM_ID bigint; + +alter table CCM_CMS.ATTACHMENT_LISTS_AUD + drop column ASSET_TYPE; + +alter table CCM_CMS.ATTACHMENT_LISTS_AUD + add column NAME varchar(255); + +alter table CCM_CMS.ATTACHMENT_LISTS_AUD + add column ITEM_ID bigint; + +alter table CCM_CMS.AUDIO_ASSETS + drop constraint FKa1m18ejmeknjiibvh2dac6tas; + +alter table CCM_CMS.AUDIO_ASSETS_AUD + drop constraint FKaf381a7d420ru9114rqcpr2b4; + +alter table CCM_CMS.BINARY_ASSETS + drop constraint FK65sp6cl7d8qjmqgku1bjtpsdy; + +alter table CCM_CMS.BINARY_ASSETS_AUD + drop constraint FKovfkjrq3eka9fsfe5sidw07p3; + +drop table if exists CCM_CMS.AttachmentList_ItemAttachment_AUD; + +alter table CCM_CMS.AUDIO_ASSETS + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.AUDIO_ASSETS_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.BINARY_ASSETS + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.BINARY_ASSETS_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.BOOKMARKS + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.BOOKMARKS_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET + rename to CCM_CMS.EXTERNAL_VIDEO_ASSETS; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET_AUD + rename to CCM_CMS.EXTERNAL_VIDEO_ASSETS_AUD; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.FILES + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.FILES_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.IMAGES + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.IMAGES_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.LEGAL_METADATA + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.LEGAL_METADATA_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.NOTES + RENAME TO CCM_CMS.SIDE_NOTES; + +alter table CCM_CMS.NOTES_AUD + RENAME TO CCM_CMS.SIDE_NOTES_AUD; + +alter table CCM_CMS.SIDE_NOTES + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.SIDE_NOTES_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.RELATED_LINKS + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.RELATED_LINKS_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +drop table if exists REUSABLE_ASSETS; + +drop table if exists REUSABLE_ASSETS_AUD; + +alter table CCM_CMS.VIDEO_ASSET + rename to CCM_CMS.VIDEO_ASSETS; + +alter table CCM_CMS.VIDEO_ASSET_AUD + rename to CCM_CMS.VIDEO_ASSETS_AUD; + +alter table CCM_CMS.VIDEO_ASSETS + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.VIDEO_ASSETS_AUD + alter column ASSET_ID RENAME TO OBJECT_ID; + +alter table CCM_CMS.NOTE_TEXTS + rename to CCM_CMS.SIDE_NOTE_TEXTS; + +alter table CCM_CMS.ATTACHMENTS + add column ATTACHMENT_LIST_ID bigint; + +alter table CCM_CMS.ASSETS + add constraint FKlbiojib44ujxv9eee1sjn67qk + foreign key (OBJECT_ID) + references CCM_CORE.CCM_OBJECTS; + +alter table CCM_CMS.ASSETS_AUD + add constraint FKi5q560xg9357da8gc5sukqbw8 + foreign key (OBJECT_ID, REV) + references CCM_CORE.CCM_OBJECTS_AUD; + +alter table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS + add constraint FKixgpo00r1cqq5jw1s7v6fchpn + foreign key (LIST_ID) + references CCM_CMS.ATTACHMENT_LISTS; + +alter table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS_AUD + add constraint FKqhqkm6tas9fdmggv4k1vj0nc7 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS_AUD + add constraint FKqv2o9jffgok4518fb5c85552l + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.ATTACHMENT_LISTS + add constraint FKqyj7ifjfyp7kmsj8fiyxn0am3 + foreign key (ITEM_ID) + references CCM_CMS.CONTENT_ITEMS; + +alter table CCM_CMS.ATTACHMENTS + add constraint FK3mqbt13sbed2ae0esrps4p0oh + foreign key (ATTACHMENT_LIST_ID) + references CCM_CMS.ATTACHMENT_LISTS; + +alter table CCM_CMS.AUDIO_ASSETS + add constraint FKgxpsfjlfsk609c0w2te18y90v + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.AUDIO_ASSETS_AUD + add constraint FKbt11nwbde1en1upceratct6s3 + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; + +alter table CCM_CMS.BINARY_ASSETS + add constraint FKltx0jq1u1aflrd20k1c77m8vh + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.BINARY_ASSETS_AUD + add constraint FK1qfap4mxprjk7gnjdcvdxr5mv + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.BOOKMARKS + add constraint FKksnngecvvxmsxdvri4shby2hy + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.BOOKMARKS_AUD + add constraint FK47cpxaw9vnnes2dbr6h3toirl + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS + add constraint FK36xjlvslk0vlekn9lsc7x1c7a + foreign key (OBJECT_ID) + references CCM_CMS.BOOKMARKS; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS_AUD + add constraint FKp3jndaw4k35wb3d6hg5ng4xww + foreign key (OBJECT_ID, REV) + references CCM_CMS.BOOKMARKS_AUD; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS + add constraint FK74al02r60wmjgpy009b2291l7 + foreign key (OBJECT_ID) + references CCM_CMS.BOOKMARKS; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS_AUD + add constraint FKg7q8dy5xbemdw7whdn68xv297 + foreign key (OBJECT_ID, REV) + references CCM_CMS.BOOKMARKS_AUD; + +alter table CCM_CMS.FILES + add constraint FKpg74w39tfbbuqhcy21u61q138 + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.FILES_AUD + add constraint FKdl876a4twd0gkranwqkdmxnwy + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; + +alter table CCM_CMS.IMAGES + add constraint FKmdqranhdstkn6m6d73l15amxs + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.IMAGES_AUD + add constraint FK4jsrdpe6d8is0ybx2p7sxivwf + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; + +alter table CCM_CMS.LEGAL_METADATA + add constraint FKnxl7uyv1ks0qabgeienx2t9d1 + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.LEGAL_METADATA_AUD + add constraint FKpt3eqil7iij6t5h1lrnjbb5xs + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.SIDE_NOTE_TEXTS + add constraint FK79g6eg2csjaixrjr2xgael8lm + foreign key (ASSET_ID) + references CCM_CMS.SIDE_NOTES; + +alter table CCM_CMS.RELATED_LINKS + add constraint FK35tv60a9kflo17h6xduvwvgis + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.RELATED_LINKS_AUD + add constraint FKiuwk6mcj3h5gccu2aviq3d8lt + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.SIDE_NOTES + add constraint FKea6cikleenmkgw5bwus22mfr3 + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.SIDE_NOTES_AUD + add constraint FKl5pkg9mp2ymc2uo4kmlubyp3m + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.VIDEO_ASSETS + add constraint FKjuywvv7wq9pyid5b6ivyrc0yk + foreign key (LEGAL_METADATA_ID) + references CCM_CMS.LEGAL_METADATA; + +alter table CCM_CMS.VIDEO_ASSETS + add constraint FKqt2cx1r31kqbqkimdld312i9g + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.VIDEO_ASSETS_AUD + add constraint FKdrx9uu9a03ju7vqvkjretohpk + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; diff --git a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_8__update_assets_and_attachments.sql b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_8__update_assets_and_attachments.sql new file mode 100644 index 000000000..dd7c3ab4e --- /dev/null +++ b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_8__update_assets_and_attachments.sql @@ -0,0 +1,394 @@ +alter table CCM_CMS.ASSETS + drop constraint UK_9l2v1u9beyemgjwqx7isbumwh; + +alter table CCM_CMS.ASSETS_AUD + drop constraint FK4m4op9s9h5qhndcsssbu55gr2; + +alter table CCM_CMS.AttachmentList_ItemAttachment_AUD + drop constraint FKduowjilu7dqfs2oja88tr5oim; + +alter table CCM_CMS.AttachmentList_ItemAttachment_AUD + drop constraint FKdtm7qp3n6cojbm9b916plsgtx; + +alter table CCM_CMS.ASSETS_AUD + drop constraint FK586j3p95nw2oa6yd06xdw0o5u; + +alter table CCM_CMS.ATTACHMENTS + drop constraint FK622uanry14vw27de3d2v9uy57; + +alter table CCM_CMS.ASSETS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.ASSETS + drop column if exists UUID; + +alter table CCM_CMS.ASSETS_AUD + rename column ASSET_ID to object_id; + +alter table CCM_CMS.ASSETS_AUD + drop column if exists revtype; + +alter table CCM_CMS.ASSETS_AUD + drop column if exists revend; + +alter table CCM_CMS.ASSETS_AUD + drop column if exists uuid; + +alter table CCM_CMS.BOOKMARKS + drop constraint FKhs1tohpjry5sqdpl3cijl5ppk; + +alter table CCM_CMS.BOOKMARKS_AUD + drop constraint FKjrk2tah1gyn67acth3g7olvuc; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS + drop constraint FK5sxviewjxfgk0at60emrpuh3n; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS_AUD + drop constraint FK6814o1fnh49p5ij9cfvr7y00s; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET + drop constraint FKc6m77lkbfa5ym2s8sq00jkyjf; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET_AUD + drop constraint FKd5efitnmsrko2vq48ei1mclfv; + +alter table CCM_CMS.FILES + drop constraint FK4e8p3tu8ocy43ofs9uifuk8gh; + +alter table CCM_CMS.FILES_AUD + drop constraint FK3c9xf8w1dr3q0grxslguvviqn; + +alter table CCM_CMS.IMAGES + drop constraint FK9mgknvtu1crw4el5d4sqy8d6c; + +alter table CCM_CMS.IMAGES_AUD + drop constraint FK6xggeoexci2har3mceo9naqiy; + +alter table CCM_CMS.LEGAL_METADATA + drop constraint FKjxss2fb6khhn68e8ccuksl9hk; + +alter table CCM_CMS.LEGAL_METADATA_AUD + drop constraint FKofjkwpepeyb6e8tytnhjfvx49; + +alter table CCM_CMS.NOTE_TEXTS + drop constraint FKa0yp21m25o7omtnag0eet8v8q; + +alter table CCM_CMS.RELATED_LINKS + drop constraint FKf4r30ra4a2ajuky0tk4lc06n5; + +alter table CCM_CMS.RELATED_LINKS_AUD + drop constraint FKkda2cf5ynu7v7udi0ytfmr9ij; + +alter table CCM_CMS.REUSABLE_ASSETS + drop constraint FKngdq6f077q6ndqn9o3jc6k14a; + +alter table CCM_CMS.REUSABLE_ASSETS + drop constraint FKhvf4mfltp8abbr5u0qgjm2jk2; + +alter table CCM_CMS.REUSABLE_ASSETS_AUD + drop constraint FKgyc5gd3cffox4wvjoir6i4gxt; + +alter table CCM_CMS.VIDEO_ASSET + drop constraint FKdjjbp8p48xwfqhw0oo79tkyjy; + +alter table CCM_CMS.VIDEO_ASSET + drop constraint FK9cynf36vykykyaga2j1xs7jkx; + +alter table CCM_CMS.VIDEO_ASSET_AUD + drop constraint FK7qsbfxxg6ixpkjjor4nbkd63i; + +create table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS ( + LIST_ID int8 not null, + LOCALIZED_VALUE text, + LOCALE varchar(255) not null, + primary key (LIST_ID, LOCALE) +); + +create table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS_AUD ( + REV integer not null, + LIST_ID int8 not null, + LOCALIZED_VALUE text not null, + LOCALE varchar(255) not null, + REVTYPE int2, + REVEND integer, + primary key (REV, LIST_ID, LOCALIZED_VALUE, LOCALE) +); + +alter table CCM_CMS.ATTACHMENT_LISTS + drop column asset_type; + +alter table CCM_CMS.ATTACHMENT_LISTS + add column NAME varchar(255); + +alter table CCM_CMS.ATTACHMENT_LISTS + add column ITEM_ID int8; + +alter table CCM_CMS.ATTACHMENT_LISTS_AUD + drop column ASSET_TYPE; + +alter table CCM_CMS.ATTACHMENT_LISTS_AUD + add column NAME varchar(255); + +alter table CCM_CMS.ATTACHMENT_LISTS_AUD + add column ITEM_ID int8; + +alter table CCM_CMS.AUDIO_ASSETS + drop constraint FKa1m18ejmeknjiibvh2dac6tas; + +alter table CCM_CMS.AUDIO_ASSETS_AUD + drop constraint FKaf381a7d420ru9114rqcpr2b4; + +alter table CCM_CMS.BINARY_ASSETS + drop constraint FK65sp6cl7d8qjmqgku1bjtpsdy; + +alter table CCM_CMS.BINARY_ASSETS_AUD + drop constraint FKovfkjrq3eka9fsfe5sidw07p3; + +drop table if exists CCM_CMS.AttachmentList_ItemAttachment_AUD; + +alter table CCM_CMS.AUDIO_ASSETS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.AUDIO_ASSETS_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.BINARY_ASSETS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.BINARY_ASSETS_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.BOOKMARKS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.BOOKMARKS_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET + rename to EXTERNAL_VIDEO_ASSETS; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSET_AUD + rename to EXTERNAL_VIDEO_ASSETS_AUD; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.FILES + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.FILES_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.IMAGES + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.IMAGES_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.LEGAL_METADATA rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.LEGAL_METADATA_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.NOTES + rename to SIDE_NOTES; + +alter table CCM_CMS.NOTES_AUD + rename to SIDE_NOTES_AUD; + +alter table CCM_CMS.SIDE_NOTES + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.SIDE_NOTES_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.RELATED_LINKS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.RELATED_LINKS_AUD rename column ASSET_ID to OBJECT_ID; + +drop table if exists CCM_CMS.REUSABLE_ASSETS; + +drop table if exists CCM_CMS.REUSABLE_ASSETS_AUD; + +alter table CCM_CMS.VIDEO_ASSET + rename to VIDEO_ASSETS; + +alter table CCM_CMS.VIDEO_ASSET_AUD + rename to VIDEO_ASSETS_AUD; + +alter table CCM_CMS.VIDEO_ASSETS + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.VIDEO_ASSETS_AUD + rename column ASSET_ID to OBJECT_ID; + +alter table CCM_CMS.NOTE_TEXTS + rename to SIDE_NOTE_TEXTS; + +alter table CCM_CMS.ATTACHMENTS + add column ATTACHMENT_LIST_ID int8; + +alter table CCM_CMS.ASSETS + add constraint FKlbiojib44ujxv9eee1sjn67qk + foreign key (OBJECT_ID) + references CCM_CORE.CCM_OBJECTS; + +alter table CCM_CMS.ASSETS_AUD + add constraint FKi5q560xg9357da8gc5sukqbw8 + foreign key (OBJECT_ID, REV) + references CCM_CORE.CCM_OBJECTS_AUD; + +alter table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS + add constraint FKixgpo00r1cqq5jw1s7v6fchpn + foreign key (LIST_ID) + references CCM_CMS.ATTACHMENT_LISTS; + +alter table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS_AUD + add constraint FKqhqkm6tas9fdmggv4k1vj0nc7 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.ATTACHMENT_LIST_DESCRIPTIONS_AUD + add constraint FKqv2o9jffgok4518fb5c85552l + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.ATTACHMENT_LISTS + add constraint FKqyj7ifjfyp7kmsj8fiyxn0am3 + foreign key (ITEM_ID) + references CCM_CMS.CONTENT_ITEMS; + +alter table CCM_CMS.ATTACHMENTS + add constraint FK3mqbt13sbed2ae0esrps4p0oh + foreign key (ATTACHMENT_LIST_ID) + references CCM_CMS.ATTACHMENT_LISTS; + +alter table CCM_CMS.AUDIO_ASSETS + add constraint FKgxpsfjlfsk609c0w2te18y90v + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.AUDIO_ASSETS_AUD + add constraint FKbt11nwbde1en1upceratct6s3 + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; + +alter table CCM_CMS.BINARY_ASSETS + add constraint FKltx0jq1u1aflrd20k1c77m8vh + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.BINARY_ASSETS_AUD + add constraint FK1qfap4mxprjk7gnjdcvdxr5mv + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.BOOKMARKS + add constraint FKksnngecvvxmsxdvri4shby2hy + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.BOOKMARKS_AUD + add constraint FK47cpxaw9vnnes2dbr6h3toirl + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS + add constraint FK36xjlvslk0vlekn9lsc7x1c7a + foreign key (OBJECT_ID) + references CCM_CMS.BOOKMARKS; + +alter table CCM_CMS.EXTERNAL_AUDIO_ASSETS_AUD + add constraint FKp3jndaw4k35wb3d6hg5ng4xww + foreign key (OBJECT_ID, REV) + references CCM_CMS.BOOKMARKS_AUD; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS + add constraint FK74al02r60wmjgpy009b2291l7 + foreign key (OBJECT_ID) + references CCM_CMS.BOOKMARKS; + +alter table CCM_CMS.EXTERNAL_VIDEO_ASSETS_AUD + add constraint FKg7q8dy5xbemdw7whdn68xv297 + foreign key (OBJECT_ID, REV) + references CCM_CMS.BOOKMARKS_AUD; + +alter table CCM_CMS.FILES + add constraint FKpg74w39tfbbuqhcy21u61q138 + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.FILES_AUD + add constraint FKdl876a4twd0gkranwqkdmxnwy + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; + +alter table CCM_CMS.IMAGES + add constraint FKmdqranhdstkn6m6d73l15amxs + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.IMAGES_AUD + add constraint FK4jsrdpe6d8is0ybx2p7sxivwf + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; + +alter table CCM_CMS.LEGAL_METADATA + add constraint FKnxl7uyv1ks0qabgeienx2t9d1 + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.LEGAL_METADATA_AUD + add constraint FKpt3eqil7iij6t5h1lrnjbb5xs + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.SIDE_NOTE_TEXTS + add constraint FK79g6eg2csjaixrjr2xgael8lm + foreign key (ASSET_ID) + references CCM_CMS.SIDE_NOTES; + +alter table CCM_CMS.RELATED_LINKS + add constraint FK35tv60a9kflo17h6xduvwvgis + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.RELATED_LINKS_AUD + add constraint FKiuwk6mcj3h5gccu2aviq3d8lt + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.SIDE_NOTES + add constraint FKea6cikleenmkgw5bwus22mfr3 + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.SIDE_NOTES_AUD + add constraint FKl5pkg9mp2ymc2uo4kmlubyp3m + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.VIDEO_ASSETS + add constraint FKjuywvv7wq9pyid5b6ivyrc0yk + foreign key (LEGAL_METADATA_ID) + references CCM_CMS.LEGAL_METADATA; + +alter table CCM_CMS.VIDEO_ASSETS + add constraint FKqt2cx1r31kqbqkimdld312i9g + foreign key (OBJECT_ID) + references CCM_CMS.BINARY_ASSETS; + +alter table CCM_CMS.VIDEO_ASSETS_AUD + add constraint FKdrx9uu9a03ju7vqvkjretohpk + foreign key (OBJECT_ID, REV) + references CCM_CMS.BINARY_ASSETS_AUD; diff --git a/ccm-cms/src/test/java/org/librecms/assets/EqualsAndHashCodeTest.java b/ccm-cms/src/test/java/org/librecms/assets/EqualsAndHashCodeTest.java index 46a27b423..60160dfbc 100644 --- a/ccm-cms/src/test/java/org/librecms/assets/EqualsAndHashCodeTest.java +++ b/ccm-cms/src/test/java/org/librecms/assets/EqualsAndHashCodeTest.java @@ -27,9 +27,12 @@ import org.libreccm.security.Role; import org.libreccm.security.User; import org.libreccm.tests.categories.UnitTest; import org.libreccm.testutils.EqualsVerifier; +import org.librecms.attachments.ItemAttachment; +import org.librecms.contentsection.ContentItem; import java.util.Arrays; import java.util.Collection; +import java.util.UUID; /** * @@ -43,7 +46,6 @@ public class EqualsAndHashCodeTest extends EqualsVerifier { public static Collection> data() { return Arrays.asList(new Class[]{ Asset.class, - ReusableAsset.class }); } @@ -86,13 +88,29 @@ public class EqualsAndHashCodeTest extends EqualsVerifier { final Category category2 = new Category(); category2.setObjectId(-4200); category2.setDisplayName("Category 2"); + + final ContentItem item1 = new ContentItem(); + item1.setDisplayName("item1"); + + final ContentItem item2 = new ContentItem(); + item2.setDisplayName("item2"); + + final ItemAttachment itemAttachment1 = new ItemAttachment<>(); + itemAttachment1.setUuid(UUID.randomUUID().toString()); + + final ItemAttachment itemAttachment2 = new ItemAttachment<>(); + itemAttachment2.setUuid(UUID.randomUUID().toString()); verifier .withPrefabValues(CcmObject.class, object1, object2) .withPrefabValues(Role.class, role1, role2) .withPrefabValues(User.class, user1, user2) .withPrefabValues(Group.class, group1, group2) - .withPrefabValues(Category.class, category1, category2); + .withPrefabValues(Category.class, category1, category2) + .withPrefabValues(ContentItem.class, item1, item2) + .withPrefabValues(ItemAttachment.class, + itemAttachment1, + itemAttachment2); } diff --git a/ccm-cms/src/test/java/org/librecms/attachments/EqualsAndHashCodeTest.java b/ccm-cms/src/test/java/org/librecms/attachments/EqualsAndHashCodeTest.java index 742a7f0cf..9acca6d18 100644 --- a/ccm-cms/src/test/java/org/librecms/attachments/EqualsAndHashCodeTest.java +++ b/ccm-cms/src/test/java/org/librecms/attachments/EqualsAndHashCodeTest.java @@ -20,12 +20,18 @@ package org.librecms.attachments; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.libreccm.core.CcmObject; +import org.libreccm.security.Group; +import org.libreccm.security.Role; import org.libreccm.tests.categories.UnitTest; import org.libreccm.testutils.EqualsVerifier; +import org.librecms.assets.Asset; +import org.librecms.contentsection.ContentItem; +import org.librecms.contentsection.ContentSection; import java.util.Arrays; import java.util.Collection; - +import java.util.UUID; /** * @@ -38,6 +44,7 @@ public class EqualsAndHashCodeTest extends EqualsVerifier { @Parameterized.Parameters(name = "{0}") public static Collection> data() { return Arrays.asList(new Class[]{ + AttachmentsConfig.class, ItemAttachment.class, AttachmentList.class }); @@ -47,4 +54,62 @@ public class EqualsAndHashCodeTest extends EqualsVerifier { super(clazz); } + @Override + protected void addPrefabValues( + final nl.jqno.equalsverifier.EqualsVerifier verifier) { + + final ContentSection section1 = new ContentSection(); + section1.setDisplayName("section1"); + + final ContentSection section2 = new ContentSection(); + section1.setDisplayName("section2"); + + final ContentItem item1 = new ContentItem(); + item1.setDisplayName("item1"); + + final ContentItem item2 = new ContentItem(); + item2.setDisplayName("item2"); + + final ItemAttachment itemAttachment1 = new ItemAttachment<>(); + itemAttachment1.setUuid(UUID.randomUUID().toString()); + + final ItemAttachment itemAttachment2 = new ItemAttachment<>(); + itemAttachment2.setUuid(UUID.randomUUID().toString()); + + final CcmObject object1 = new CcmObject(); + object1.setDisplayName("object1"); + + final CcmObject object2 = new CcmObject(); + object2.setDisplayName("object2"); + + final Role role1 = new Role(); + role1.setName("role1"); + + final Role role2 = new Role(); + role1.setName("role2"); + + final Group group1 = new Group(); + group1.setName("group1"); + + final Group group2 = new Group(); + group1.setName("group2"); + + final Asset asset1 = new Asset(); + asset1.setDisplayName("asset1"); + + final Asset asset2 = new Asset(); + asset2.setDisplayName("asset2"); + + verifier + .withPrefabValues(ContentSection.class, section1, section2) + .withPrefabValues(ContentItem.class, item1, item2) + .withPrefabValues(ItemAttachment.class, + itemAttachment1, + itemAttachment2) + .withPrefabValues(CcmObject.class, object1, object2) + .withPrefabValues(Role.class, role1, role2) + .withPrefabValues(Group.class, group1, group2) + .withPrefabValues(Asset.class, asset1, asset2); + } + }