From 362bc06205c58882d19a28ef7a2093f1bce26c29 Mon Sep 17 00:00:00 2001 From: jensp Date: Mon, 22 Jul 2019 15:53:22 +0000 Subject: [PATCH] Several bugfixes, migrations for Person and Organization assets etc git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@6148 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: 6b7bd96e600641881cf8d0a59b45abc3c2ecacd7 --- .../src/main/webapp/WEB-INF/web.xml | 4 +- .../forms/AbstractContactableEntityForm.java | 71 ++++++- .../cms/ui/assets/forms/BookmarkForm.java | 2 - .../cms/ui/assets/forms/OrganizationForm.java | 93 ++++++++ .../cms/ui/folder/FolderPathListModel.java | 20 +- .../folder/FolderPathListModelController.java | 51 +++++ .../cms/ui/folder/FolderTreeModelBuilder.java | 14 +- .../ui/folder/FolderTreeModelController.java | 31 ++- .../org/librecms/assets/ContactEntry.java | 3 + .../org/librecms/assets/ContactEntryKey.java | 154 ++++++++++++++ .../assets/ContactEntryKeyRepository.java | 59 ++++++ .../librecms/assets/ContactableEntity.java | 13 +- .../org/librecms/assets/Organization.java | 13 +- .../main/java/org/librecms/assets/Person.java | 199 ++++++++++++------ .../java/org/librecms/assets/PersonName.java | 152 +++++++++++++ .../org/librecms/assets/PostalAddress.java | 2 + .../dispatcher/MultilingualItemResolver.java | 3 +- .../h2/V7_0_0_20__persons_orga_assets.sql | 179 +++++++++++++--- .../pgsql/V7_0_0_20__persons_orga_assets.sql | 177 +++++++++++++--- .../org/librecms/CmsResources.properties | 1 + .../org/librecms/CmsResources_de.properties | 1 + .../org/librecms/CmsResources_fr.properties | 1 + .../org/librecms/assets/Assets.properties | 4 + .../org/librecms/assets/Assets_de.properties | 4 + .../org/libreccm/categorization/Category.java | 20 +- .../configuration/LocalizedStringSetting.java | 7 +- .../configuration/StringListSetting.java | 8 +- 27 files changed, 1104 insertions(+), 182 deletions(-) create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/OrganizationForm.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModelController.java create mode 100644 ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java create mode 100644 ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyRepository.java create mode 100644 ccm-cms/src/main/java/org/librecms/assets/PersonName.java diff --git a/ccm-bundle-devel-wildfly-web/src/main/webapp/WEB-INF/web.xml b/ccm-bundle-devel-wildfly-web/src/main/webapp/WEB-INF/web.xml index 2afd7ee37..8ee4f3591 100644 --- a/ccm-bundle-devel-wildfly-web/src/main/webapp/WEB-INF/web.xml +++ b/ccm-bundle-devel-wildfly-web/src/main/webapp/WEB-INF/web.xml @@ -66,7 +66,7 @@ true - + diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityForm.java index 54b1a3f55..67969007a 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityForm.java @@ -18,16 +18,21 @@ */ package com.arsdigita.cms.ui.assets.forms; +import com.arsdigita.bebop.ActionLink; import com.arsdigita.bebop.Component; import com.arsdigita.bebop.ControlLink; import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.Label; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.Table; +import com.arsdigita.bebop.event.PrintEvent; +import com.arsdigita.bebop.event.PrintListener; import com.arsdigita.bebop.event.TableActionEvent; import com.arsdigita.bebop.event.TableActionListener; +import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.TextField; +import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.bebop.table.TableCellRenderer; import com.arsdigita.bebop.table.TableColumn; import com.arsdigita.bebop.table.TableColumnModel; @@ -40,6 +45,7 @@ import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.util.LockableImpl; import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.configuration.ConfigurationManager; import org.librecms.CmsConstants; import org.librecms.assets.ContactEntry; import org.librecms.assets.ContactableEntity; @@ -48,6 +54,8 @@ import java.util.Iterator; import java.util.List; import java.util.Optional; +import static org.librecms.CmsConstants.*; + /** * * @author Jens Pelzetter @@ -62,28 +70,51 @@ public abstract class AbstractContactableEntityForm private static final int COL_CONTACT_ENTRIES_REMOVE = 2; + private final AssetPane assetPane; + private Table contactEntriesTable; private SingleSelect contactEntryKeySelect; private TextField contactEntryValueField; + private ActionLink addContactEntryLink; + private AssetSearchWidget postalAddressSearchWidget; public AbstractContactableEntityForm(final AssetPane assetPane) { + super(assetPane); + + this.assetPane = assetPane; } @Override protected void addWidgets() { - contactEntriesTable = buildContactEntriesTable(); + addPropertyWidgets(); + contactEntriesTable = buildContactEntriesTable(); + add(contactEntriesTable); + + contactEntryKeySelect = new SingleSelect(new StringParameter( + "contactentry-key")); + add(contactEntryKeySelect); } + protected abstract void addPropertyWidgets(); + private Table buildContactEntriesTable() { - final Table table = new Table(); + final Table table = new Table() { + + @Override + public boolean isVisible(final PageState state) { + return getSelectedAsset(state).isPresent(); + } + + }; + final TableColumnModel columnModel = table.getColumnModel(); columnModel.add(new TableColumn( COL_CONTACT_ENTRIES_KEY, @@ -160,19 +191,15 @@ public abstract class AbstractContactableEntityForm private class ContactEntriesTableModelBuilder extends LockableImpl implements TableModelBuilder { - private final ContactableEntity contactableEntity; - - public ContactEntriesTableModelBuilder( - final ContactableEntity contactableEntity) { - - this.contactableEntity = contactableEntity; - } - @Override public TableModel makeModel(final Table table, final PageState state) { - final List contactEntries = contactableEntity + final ContactableEntity selected = getSelectedAsset(state) + .orElseThrow( + () -> new IllegalStateException("No asset selected") + ); + final List contactEntries = selected .getContactEntries(); return new ContactEntriesTableModel(contactEntries); } @@ -253,4 +280,26 @@ public abstract class AbstractContactableEntityForm } + private class ContactEntryKeySelectPrintListener implements PrintListener { + + @Override + public void prepare(final PrintEvent event) { + + final SingleSelect target = (SingleSelect) event.getTarget(); + target.clearOptions(); + + target.addOption( + new Option("", + new Label(new GlobalizedMessage("cms.ui.select_one"), + CMS_BUNDLE)) + ); + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + + + throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + } + + } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java index 0c6dc2df5..9b785f547 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java @@ -18,8 +18,6 @@ */ package com.arsdigita.cms.ui.assets.forms; -import com.arsdigita.bebop.form.TextArea; -import com.arsdigita.bebop.form.TextField; import com.arsdigita.cms.ui.assets.AssetPane; import org.librecms.assets.Bookmark; diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/OrganizationForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/OrganizationForm.java new file mode 100644 index 000000000..4ab4c4848 --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/OrganizationForm.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2019 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 com.arsdigita.cms.ui.assets.forms; + +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.cms.ui.assets.AssetPane; +import com.arsdigita.globalization.GlobalizedMessage; + +import org.librecms.CmsConstants; +import org.librecms.assets.Organization; +import org.librecms.contentsection.Asset; + +import java.util.Objects; + +/** + * + * @author Jens Pelzetter + */ +public class OrganizationForm extends AbstractContactableEntityForm { + + private TextField organizationName; + + public OrganizationForm(final AssetPane assetPane) { + + super(assetPane); + } + + @Override + protected void addPropertyWidgets() { + + add(new Label( + new GlobalizedMessage("cms.ui.assets.organization.name", + CmsConstants.CMS_BUNDLE))); + organizationName = new TextField("organization-name"); + add(organizationName); + } + + @Override + protected Class getAssetClass() { + + return Organization.class; + } + + @Override + protected void showLocale(final PageState state) { + + // Organization has no localizable fields. + } + + @Override + protected void updateAsset(final Asset asset, + final FormSectionEvent event) + throws FormProcessException { + + Objects.requireNonNull(asset); + Objects.requireNonNull(event); + + final PageState state = event.getPageState(); + + if (!(asset instanceof Organization)) { + throw new IllegalArgumentException(String.format( + "The provided asset is not an instance of \"%s\" " + + "or a subclass,but of %s.", + Organization.class.getName(), + asset.getClass().getName())); + } + + final Organization organization = (Organization) asset; + + organization.setName((String) organizationName.getValue(state)); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java index 8a42185c2..1b03a5028 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModel.java @@ -38,19 +38,24 @@ import java.util.Locale; class FolderPathListModel implements ListModel { private final Locale defaultLocale; + private final Iterator pathFolders; + private Folder currentFolder; public FolderPathListModel(final Folder folder) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final FolderManager folderManager = cdiUtil.findBean(FolderManager.class); - final List parentFolders = folderManager.getParentFolders(folder); + final FolderManager folderManager = cdiUtil + .findBean(FolderManager.class); + final List parentFolders = folderManager + .getParentFolders(folder); final List path = new ArrayList<>(); path.addAll(parentFolders); path.add(folder); pathFolders = path.iterator(); - - final ConfigurationManager confManager = cdiUtil.findBean(ConfigurationManager.class); + + final ConfigurationManager confManager = cdiUtil.findBean( + ConfigurationManager.class); final KernelConfig kernelConfig = confManager.findConfiguration( KernelConfig.class); defaultLocale = kernelConfig.getDefaultLocale(); @@ -68,7 +73,12 @@ class FolderPathListModel implements ListModel { @Override public Object getElement() { - return currentFolder.getTitle().getValue(defaultLocale); + + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final FolderPathListModelController controller = cdiUtil + .findBean(FolderPathListModelController.class); + + return controller.getElement(currentFolder, defaultLocale); } @Override diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModelController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModelController.java new file mode 100644 index 000000000..bd65f232a --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderPathListModelController.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2019 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 com.arsdigita.cms.ui.folder; + +import org.librecms.contentsection.Folder; +import org.librecms.contentsection.FolderRepository; + +import java.util.Locale; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class FolderPathListModelController { + + @Inject + private FolderRepository folderRepository; + + @Transactional(Transactional.TxType.REQUIRED) + public String getElement(final Folder folder, final Locale locale) { + + final Folder result = folderRepository + .findById(folder.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No folder wit ID %d found.", folder.getObjectId()))); + + return result.getTitle().getValue(locale); + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java index 3cc24b7a6..dd998bc17 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java @@ -51,7 +51,7 @@ import org.libreccm.configuration.ConfigurationManager; * @author David Lutterkort * @author Jens Pelzetter */ -public abstract class FolderTreeModelBuilder +public abstract class FolderTreeModelBuilder extends LockableImpl implements TreeModelBuilder { @@ -138,7 +138,6 @@ public abstract class FolderTreeModelBuilder // final ContentSection section = CMS.getContext().getContentSection(); // return section.getRootDocumentsFolder(); // } - /** * Return the root folder for the tree model in the current request. * @@ -167,16 +166,19 @@ public abstract class FolderTreeModelBuilder final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final GlobalizationHelper globalizationHelper = cdiUtil.findBean( GlobalizationHelper.class); + final FolderTreeModelController controller = cdiUtil + .findBean(FolderTreeModelController.class); final Locale locale = globalizationHelper.getNegotiatedLocale(); - if (folder.getTitle().hasValue(locale)) { - return folder.getTitle().getValue(locale); + if (controller.hasTitleValue(folder, locale)) { + return controller.getTitleValue(folder, locale); } else { final ConfigurationManager confManager = cdiUtil.findBean( ConfigurationManager.class); final KernelConfig kernelConfig = confManager.findConfiguration( KernelConfig.class); - final String value = folder.getTitle().getValue(kernelConfig. - getDefaultLocale()); + final String value = controller + .getTitleValue(folder, + kernelConfig.getDefaultLocale()); if (value == null) { return folder.getName(); } else { diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java index 2c9782137..54ee070d9 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java @@ -27,6 +27,7 @@ import org.librecms.contentsection.FolderRepository; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Optional; @@ -63,6 +64,32 @@ public class FolderTreeModelController { } } + @Transactional(Transactional.TxType.REQUIRED) + public boolean hasTitleValue(final Folder ofFolder, + final Locale forLocale) { + + final Folder folder = folderRepo + .findById(ofFolder.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No folder with Id %d found.", + ofFolder.getObjectId()))); + + return folder.getTitle().hasValue(forLocale); + } + + @Transactional(Transactional.TxType.REQUIRED) + public String getTitleValue(final Folder ofFolder, + final Locale forLocale) { + + final Folder folder = folderRepo + .findById(ofFolder.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No folder with Id %d found.", + ofFolder.getObjectId()))); + + return folder.getTitle().getValue(forLocale); + } + @Transactional(Transactional.TxType.REQUIRED) public boolean hasChildren(final TreeNode node) { return !getCurrentFolder(node).getSubCategories().isEmpty(); @@ -87,11 +114,11 @@ public class FolderTreeModelController { } final List ancestorIds = new ArrayList<>(); Category current = theFolder.get(); - while(current != null) { + while (current != null) { ancestorIds.add(current.getObjectId()); current = current.getParentCategory(); } - + return ancestorIds; } diff --git a/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java b/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java index 992a48da2..db75ff7c3 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ContactEntry.java @@ -18,6 +18,8 @@ */ package org.librecms.assets; +import org.hibernate.envers.Audited; + import java.io.Serializable; import java.util.Objects; @@ -36,6 +38,7 @@ import static org.librecms.CmsConstants.*; * @author Jens Pelzetter */ @Entity +@Audited @Table(name = "CONTACT_ENTRIES", schema = DB_SCHEMA) public class ContactEntry implements Serializable { diff --git a/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java new file mode 100644 index 000000000..2ec3ce2ee --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKey.java @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2019 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.libreccm.l10n.LocalizedString; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.AssociationOverride; +import javax.persistence.Column; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.Table; + +import static org.librecms.CmsConstants.*; + +/** + * + * @author Jens Pelzetter + */ +@Entity +@Table(name = "CONTACT_ENTRY_KEYS") +public class ContactEntryKey implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @Column(name = "KEY_ID") + private long keyId; + + @Column(name = "ENTRY_KEY", length = 255) + private String entryKey; + + @Embedded + @AssociationOverride( + name = "values", + joinTable = @JoinTable(name = "CONTACT_ENTRY_KEY_LABELS", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "KEY_ID") + } + ) + ) + private LocalizedString label; + + public ContactEntryKey() { + + super(); + label = new LocalizedString(); + } + + public long getKeyId() { + return keyId; + } + + public void setKeyId(final long keyId) { + this.keyId = keyId; + } + + public String getEntryKey() { + return entryKey; + } + + public void setEntryKey(final String entryKey) { + this.entryKey = Objects.requireNonNull(entryKey); + } + + public LocalizedString getLabel() { + return label; + } + + public void setLabel(final LocalizedString label) { + + this.label = Objects.requireNonNull(label); + } + + @Override + public int hashCode() { + int hash = 7; + hash = 73 * hash + (int) (keyId ^ (keyId >>> 32)); + hash = 73 * hash + Objects.hashCode(entryKey); + hash = 73 * hash + Objects.hashCode(label); + return hash; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof ContactEntryKey)) { + return false; + } + final ContactEntryKey other = (ContactEntryKey) obj; + if (keyId != other.getKeyId()) { + return false; + } + if (!Objects.equals(entryKey, other.getEntryKey())) { + return false; + } + if (!Objects.equals(label, other.getLabel())) { + return false; + } + return true; + } + + public boolean canEqual(final Object obj) { + + return obj instanceof ContactEntryKey; + } + + public String toString(final String data) { + + return String.format("%s{ " + + "keyId = %d, " + + "entryKey = \"%s\", " + + "label = %s%s }", + super.toString(), + keyId, + entryKey, + Objects.toString(label), + data); + } + + @Override + public final String toString() { + + return toString(""); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyRepository.java b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyRepository.java new file mode 100644 index 000000000..3d6ef8979 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/assets/ContactEntryKeyRepository.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2019 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.libreccm.core.AbstractEntityRepository; + +import javax.enterprise.context.RequestScoped; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class ContactEntryKeyRepository + extends AbstractEntityRepository{ + + private static final long serialVersionUID = 1L; + + @Override + public Class getEntityClass() { + + return ContactEntryKey.class; + } + + @Override + public String getIdAttributeName() { + + return "keyId"; + } + + @Override + public Long getIdOfEntity(final ContactEntryKey entity) { + + return entity.getKeyId(); + } + + @Override + public boolean isNew(final ContactEntryKey entity) { + + return entity.getKeyId() == 0; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/assets/ContactableEntity.java b/ccm-cms/src/main/java/org/librecms/assets/ContactableEntity.java index c6ea3f393..d86fbafe7 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ContactableEntity.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ContactableEntity.java @@ -20,6 +20,7 @@ package org.librecms.assets; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; +import org.hibernate.envers.Audited; import org.librecms.contentsection.Asset; import java.util.ArrayList; @@ -37,11 +38,13 @@ import javax.persistence.Table; import static org.librecms.CmsConstants.*; /** - * Base class for contactable entities. Not for public use + * Base class for contactable entities. Not for public use, but needs to be + * public to give UI classes in the {@code com.arsdigita} packages access. * * @author Jens Pelzetter */ @Entity +@Audited @Table(name = "CONTACTABLE_ENTITIES", schema = DB_SCHEMA) public class ContactableEntity extends Asset { @@ -99,8 +102,8 @@ public class ContactableEntity extends Asset { @Override public int hashCode() { int hash = super.hashCode(); - hash = 59 * hash + Objects.hashCode(this.contactEntries); - hash = 59 * hash + Objects.hashCode(this.postalAddress); + hash = 59 * hash + Objects.hashCode(contactEntries); + hash = 59 * hash + Objects.hashCode(postalAddress); return hash; } @@ -124,10 +127,10 @@ public class ContactableEntity extends Asset { if (!other.canEqual(this)) { return false; } - if (!Objects.equals(this.contactEntries, other.getContactEntries())) { + if (!Objects.equals(contactEntries, other.getContactEntries())) { return false; } - return Objects.equals(this.postalAddress, other.getPostalAddress()); + return Objects.equals(postalAddress, other.getPostalAddress()); } @Override diff --git a/ccm-cms/src/main/java/org/librecms/assets/Organization.java b/ccm-cms/src/main/java/org/librecms/assets/Organization.java index e0e06891c..94d474582 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/Organization.java +++ b/ccm-cms/src/main/java/org/librecms/assets/Organization.java @@ -18,6 +18,10 @@ */ package org.librecms.assets; +import com.arsdigita.cms.ui.assets.forms.OrganizationForm; + +import org.hibernate.envers.Audited; + import java.util.Objects; import javax.persistence.Column; @@ -25,13 +29,20 @@ import javax.persistence.Entity; import javax.persistence.Table; import static org.librecms.CmsConstants.*; +import static org.librecms.assets.AssetConstants.*; /** * A reusable piece of information about an organization. - * + * * @author Jens Pelzetter */ +@AssetType(assetForm = OrganizationForm.class, + labelBundle = ASSETS_BUNDLE, + labelKey = "organization.label", + descriptionBundle = ASSETS_BUNDLE, + descriptionKey = "organization.description") @Entity +@Audited @Table(name = "ORGANIZATIONS", schema = DB_SCHEMA) public class Organization extends ContactableEntity { diff --git a/ccm-cms/src/main/java/org/librecms/assets/Person.java b/ccm-cms/src/main/java/org/librecms/assets/Person.java index 98b064e15..b110fc3b3 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/Person.java +++ b/ccm-cms/src/main/java/org/librecms/assets/Person.java @@ -21,18 +21,24 @@ package org.librecms.assets; import org.hibernate.envers.Audited; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Objects; +import javax.persistence.AssociationOverride; import javax.persistence.Column; +import javax.persistence.ElementCollection; import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; import javax.persistence.Table; import static org.librecms.CmsConstants.*; -import static org.librecms.assets.AssetConstants.*; /** - * An asset representing a person. - * + * An asset representing a person. + * * @author Jens Pelzetter */ @Entity @@ -47,68 +53,117 @@ public class Person extends ContactableEntity { private static final long serialVersionUID = 1L; - /** - * The surname/familyname of the person - */ - @Column(name = "SURNAME") - private String surname; - - /** - * The given name of the person. - */ - @Column(name = "GIVEN_NAME") - private String givenName; - - /** - * Any prefixes to the name of the person. Examples are Prof. or Dr. - */ - @Column(name = "NAME_PREFIX") - private String prefix; - - /** - * Any suffixes to the name of the person. Examples for suffixes are - * PhD, or especially for Great Britain the membership in various orders, - * for example KBE or CBE. - */ - @Column(name = "SUFFIX") - private String suffix; + @ElementCollection + @JoinTable( + joinColumns = { + @JoinColumn(name = "PERSON_ID") + }, + name = "PERSON_NAMES", + schema = DB_SCHEMA + ) + private List personNames; +// /** +// * The surname/familyname of the person +// */ +// @Column(name = "SURNAME") +// private String surname; +// +// /** +// * The given name of the person. +// */ +// @Column(name = "GIVEN_NAME") +// private String givenName; +// +// /** +// * Any prefixes to the name of the person. Examples are Prof. or Dr. +// */ +// @Column(name = "NAME_PREFIX") +// private String prefix; +// +// /** +// * Any suffixes to the name of the person. Examples for suffixes are +// * PhD, or especially for Great Britain the membership in various orders, +// * for example KBE or CBE. +// */ +// @Column(name = "SUFFIX") +// private String suffix; /** * The birthdate of the person. */ - @Column(name = "BIRTHDATA") + @Column(name = "BIRTHDATE") private LocalDate birthdate; - public String getSurname() { - return surname; + public Person() { + + super(); + + personNames = new ArrayList<>(); } - public void setSurname(final String surname) { - this.surname = surname; +// public String getSurname() { +// return surname; +// } +// +// public void setSurname(final String surname) { +// this.surname = surname; +// } +// +// public String getGivenName() { +// return givenName; +// } +// +// public void setGivenName(final String givenName) { +// this.givenName = givenName; +// } +// +// public String getPrefix() { +// return prefix; +// } +// +// public void setPrefix(final String prefix) { +// this.prefix = prefix; +// } +// +// public String getSuffix() { +// return suffix; +// } +// +// public void setSuffix(final String suffix) { +// this.suffix = suffix; +// } + public List getPersonNames() { + + return Collections.unmodifiableList(personNames); } - public String getGivenName() { - return givenName; + /** + * The current name of the person, the last entry in the list. + * + * @return + */ + public PersonName getPersonName() { + + if (personNames.isEmpty()) { + return null; + } else { + return personNames.get(personNames.size() - 1); + } } - public void setGivenName(final String givenName) { - this.givenName = givenName; + protected void addPersonName(final PersonName personName) { + + personNames.add(personName); } - public String getPrefix() { - return prefix; + protected void removePersonName(final PersonName personName) { + + personNames.remove(personName); } - public void setPrefix(final String prefix) { - this.prefix = prefix; - } + protected void setPersonNames(final List personNames) { - public String getSuffix() { - return suffix; - } - - public void setSuffix(final String suffix) { - this.suffix = suffix; + this.personNames = new ArrayList<>(personNames); } public LocalDate getBirthdate() { @@ -122,10 +177,11 @@ public class Person extends ContactableEntity { @Override public int hashCode() { int hash = super.hashCode(); - hash = 37 * hash + Objects.hashCode(surname); - hash = 37 * hash + Objects.hashCode(givenName); - hash = 37 * hash + Objects.hashCode(prefix); - hash = 37 * hash + Objects.hashCode(suffix); +// hash = 37 * hash + Objects.hashCode(surname); +// hash = 37 * hash + Objects.hashCode(givenName); +// hash = 37 * hash + Objects.hashCode(prefix); +// hash = 37 * hash + Objects.hashCode(suffix); + hash = 37 * hash + Objects.hashCode(personNames); hash = 37 * hash + Objects.hashCode(birthdate); return hash; } @@ -150,16 +206,19 @@ public class Person extends ContactableEntity { if (!other.canEqual(this)) { return false; } - if (!Objects.equals(surname, other.getSurname())) { - return false; - } - if (!Objects.equals(givenName, other.getGivenName())) { - return false; - } - if (!Objects.equals(prefix, other.getPrefix())) { - return false; - } - if (!Objects.equals(suffix, other.getSuffix())) { +// if (!Objects.equals(surname, other.getSurname())) { +// return false; +// } +// if (!Objects.equals(givenName, other.getGivenName())) { +// return false; +// } +// if (!Objects.equals(prefix, other.getPrefix())) { +// return false; +// } +// if (!Objects.equals(suffix, other.getSuffix())) { +// return false; +// } + if (!Objects.equals(personNames, other.getPersonNames())) { return false; } return Objects.equals(birthdate, other.getBirthdate()); @@ -176,14 +235,16 @@ public class Person extends ContactableEntity { return super.toString(String.format( "surname = \"%s\", " - + "givenName = \"%s\", " - + "prefix = \"%s\", " - + "suffix = \"%s\", " + + "personNames = \"%s\", " + // + "givenName = \"%s\", " + // + "prefix = \"%s\", " + // + "suffix = \"%s\", " + "birthdate = %s%s", - surname, - givenName, - prefix, - suffix, + Objects.toString(personNames), + // surname, + // givenName, + // prefix, + // suffix, Objects.toString(birthdate), data)); } diff --git a/ccm-cms/src/main/java/org/librecms/assets/PersonName.java b/ccm-cms/src/main/java/org/librecms/assets/PersonName.java new file mode 100644 index 000000000..9e2b113b3 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/assets/PersonName.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2019 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 java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Column; +import javax.persistence.Embeddable; + +/** + * + * @author Jens Pelzetter + */ +@Embeddable +public class PersonName implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * The surname/familyname of the person + */ + @Column(name = "SURNAME") + private String surname; + + /** + * The given name of the person. + */ + @Column(name = "GIVEN_NAME") + private String givenName; + + /** + * Any prefixes to the name of the person. Examples are Prof. or Dr. + */ + @Column(name = "NAME_PREFIX") + private String prefix; + + /** + * Any suffixes to the name of the person. Examples for suffixes are PhD, or + * especially for Great Britain the membership in various orders, for + * example KBE or CBE. + */ + @Column(name = "SUFFIX") + private String suffix; + + public String getSurname() { + return surname; + } + + public void setSurname(final String surname) { + this.surname = surname; + } + + public String getGivenName() { + return givenName; + } + + public void setGivenName(final String givenName) { + this.givenName = givenName; + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(final String prefix) { + this.prefix = prefix; + } + + public String getSuffix() { + return suffix; + } + + public void setSuffix(final String suffix) { + this.suffix = suffix; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 79 * hash + Objects.hashCode(surname); + hash = 79 * hash + Objects.hashCode(givenName); + hash = 79 * hash + Objects.hashCode(prefix); + hash = 79 * hash + Objects.hashCode(suffix); + return hash; + } + + @Override + public boolean equals(final Object obj) { + + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof PersonName)) { + return false; + } + final PersonName other = (PersonName) obj; + if (!other.canEqual(this)) { + return false; + } + if (!Objects.equals(surname, other.getSurname())) { + return false; + } + if (!Objects.equals(givenName, other.getGivenName())) { + return false; + } + if (!Objects.equals(prefix, other.getPrefix())) { + return false; + } + return Objects.equals(suffix, other.getSuffix()); + } + + public boolean canEqual(final Object obj) { + + return obj instanceof PersonName; + } + + public String toString(final String data) { + + return String.format("%s{ " + + "surname = \"%s\", " + + "givenName = \"%s\", " + + "prefix = \"%s\", " + + "suffix = \"%s\"%s" + + " }", + super.toString(), + surname, + givenName, + prefix, + suffix); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/assets/PostalAddress.java b/ccm-cms/src/main/java/org/librecms/assets/PostalAddress.java index ffee8f118..9454354a7 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/PostalAddress.java +++ b/ccm-cms/src/main/java/org/librecms/assets/PostalAddress.java @@ -18,6 +18,7 @@ */ package org.librecms.assets; +import org.hibernate.envers.Audited; import org.librecms.contentsection.Asset; import java.util.Objects; @@ -34,6 +35,7 @@ import static org.librecms.CmsConstants.*; * @author Jens Pelzetter */ @Entity +@Audited @Table(name = "POSTAL_ADDRESSES", schema = DB_SCHEMA) public class PostalAddress extends Asset { diff --git a/ccm-cms/src/main/java/org/librecms/dispatcher/MultilingualItemResolver.java b/ccm-cms/src/main/java/org/librecms/dispatcher/MultilingualItemResolver.java index 0e913b673..4f0c6f336 100644 --- a/ccm-cms/src/main/java/org/librecms/dispatcher/MultilingualItemResolver.java +++ b/ccm-cms/src/main/java/org/librecms/dispatcher/MultilingualItemResolver.java @@ -151,8 +151,7 @@ public class MultilingualItemResolver implements ItemResolver { // nothing to do, if root folder is null LOGGER.debug("The root folder is null; returning no item"); } else { - LOGGER.debug("Using root folder {}...", - Objects.toString(rootFolder)); + LOGGER.debug("Using root folder {}...", rootFolder.getName()); if (ContentItemVersion.LIVE.toString().equals(context)) { LOGGER.debug("The use context is 'live'"); diff --git a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_20__persons_orga_assets.sql b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_20__persons_orga_assets.sql index 9f6948833..5e4c97a3b 100644 --- a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_20__persons_orga_assets.sql +++ b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_20__persons_orga_assets.sql @@ -1,32 +1,89 @@ create table CONTACT_ENTRIES ( CONTACT_ENTRY_ID bigint not null, - ENTRY_KEY varchar(255) not null, - ENTRY_ORDER bigint, - ENTRY_VALUE varchar(4096), - CONTACTABLE_ID bigint, - primary key (CONTACT_ENTRY_ID) + ENTRY_KEY varchar(255) not null, + ENTRY_ORDER bigint, + ENTRY_VALUE varchar(4096), + CONTACTABLE_ID bigint, + primary key (CONTACT_ENTRY_ID) +); + +create table CCM_CMS.CONTACT_ENTRIES_AUD ( + CONTACT_ENTRY_ID bigint not null, + REV integer not null, + REVTYPE tinyint, + REVEND integer, + ENTRY_KEY varchar(255), + ENTRY_ORDER bigint, + ENTRY_VALUE varchar(4096), + primary key (CONTACT_ENTRY_ID, REV) ); create table CONTACTABLE_ENTITIES ( - OBJECT_ID bigint not null, + OBJECT_ID bigint not null, POSTAL_ADDRESS_ID bigint, primary key (OBJECT_ID) ); +create table CCM_CMS.CONTACTABLE_ENTITIES_AUD ( + OBJECT_ID bigint not null, + REV integer not null, + POSTAL_ADDRESS_ID bigint, + primary key (OBJECT_ID, REV) +); + +create table CCM_CMS.ContactableEntity_ContactEntry_AUD ( + REV integer not null, + CONTACTABLE_ID bigint not null, + CONTACT_ENTRY_ID bigint not null, + REVTYPE tinyint, + REVEND integer, + primary key (REV, CONTACTABLE_ID, CONTACT_ENTRY_ID) +); + create table ORGANIZATIONS ( NAME varchar(1024), OBJECT_ID bigint not null, primary key (OBJECT_ID) ); +create table CCM_CMS.ORGANIZATIONS_AUD ( + OBJECT_ID bigint not null, + REV integer not null, + NAME varchar(1024), + primary key (OBJECT_ID, REV) +); + create table PERSONS ( - BIRTHDATA date, + BIRTHDATE date, + OBJECT_ID bigint not null, + primary key (OBJECT_ID) +); + +create table CCM_CMS.PERSONS_AUD ( + OBJECT_ID bigint not null, + REV integer not null, + BIRTHDATE date, + primary key (OBJECT_ID, REV) +); + +create table CCM_CMS.PERSON_NAMES ( + PERSON_ID bigint not null, GIVEN_NAME varchar(255), NAME_PREFIX varchar(255), SUFFIX varchar(255), + SURNAME varchar(255) +); + + create table CCM_CMS.PERSON_NAMES_AUD ( + REV integer not null, + REVTYPE tinyint not null, + PERSON_ID bigint not null, + REVEND integer, SURNAME varchar(255), - OBJECT_ID bigint not null, - primary key (OBJECT_ID) + NAME_PREFIX varchar(255), + GIVEN_NAME varchar(255), + SUFFIX varchar(255), + primary key (REV, REVTYPE, PERSON_ID) ); create table POSTAL_ADDRESSES ( @@ -39,32 +96,88 @@ create table POSTAL_ADDRESSES ( primary key (OBJECT_ID) ); -alter table CONTACT_ENTRIES - add constraint FKfm16ni25r5iscfcyqhlyo4y24 - foreign key (CONTACTABLE_ID) - references CONTACTABLE_ENTITY; +create table CCM_CMS.POSTAL_ADDRESSES_AUD ( + OBJECT_ID bigint not null, + REV integer not null, + ADDRESS varchar(2048), + CITY varchar(512), + ISO_COUNTRY_CODE varchar(10), + POSTAL_CODE varchar(255), + ADDRESS_STATE varchar(255), + primary key (OBJECT_ID, REV) +); -alter table CONTACTABLE_ENTITY - add constraint FKn7nb0chctw8ih05kguf2s4jh0 - foreign key (POSTAL_ADDRESS_ID) - references POSTAL_ADDRESSES; +alter table CCM_CMS.CONTACT_ENTRIES + add constraint FKljrrfco44damal9eaqrnfam0m + foreign key (CONTACTABLE_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; -alter table CONTACTABLE_ENTITY - add constraint FK37gvl3x07envs4u4lwustuyge - foreign key (OBJECT_ID) - references CCM_CMS.ASSETS; +alter table CCM_CMS.CONTACT_ENTRIES_AUD + add constraint FKib8xp3ab8kdkc0six36f99e2g + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; -alter table ORGANIZATIONS - add constraint FKjjcnjs0eecrla6eqq8fes8o86 - foreign key (OBJECT_ID) - references CONTACTABLE_ENTITY; +alter table CCM_CMS.CONTACT_ENTRIES_AUD + add constraint FKrse7ibjqsfnny5t1b2tqqs3pt + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; -alter table PERSONS - add constraint FK3i2r1w7qc1ofdn4jlbak7vkpu - foreign key (OBJECT_ID) - references CONTACTABLE_ENTITY; +alter table CCM_CMS.CONTACTABLE_ENTITIES + add constraint FKqefwowr9adclj3xvpfje9rddr + foreign key (POSTAL_ADDRESS_ID) + references CCM_CMS.POSTAL_ADDRESSES; -alter table POSTAL_ADDRESSES - add constraint FK4vajjjjo8ro0wns58t8f3i782 - foreign key (OBJECT_ID) - references CCM_CMS.ASSETS; \ No newline at end of file +alter table CCM_CMS.CONTACTABLE_ENTITIES + add constraint FKhdwlhf3jp8wf5wxjkoynrcspj + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.CONTACTABLE_ENTITIES_AUD + add constraint FKjx8trfvt96fkdn6bafnh839id + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.ContactableEntity_ContactEntry_AUD + add constraint FKs5tfdp1auj9ocgvfa9ivec517 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.ContactableEntity_ContactEntry_AUD + add constraint FKskn2ovg24tnnnwd2o8y0biyje + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.ORGANIZATIONS + add constraint FK77ig0to48xrlfx8qsc0vlfsp6 + foreign key (OBJECT_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; + +alter table CCM_CMS.ORGANIZATIONS_AUD + add constraint FKp0k3bf008pih96sguio80siql + foreign key (OBJECT_ID, REV) + references CCM_CMS.CONTACTABLE_ENTITIES_AUD; + +alter table CCM_CMS.PERSON_NAMES + add constraint FK2yluyhmpuhwxafcbna6u8txrt + foreign key (PERSON_ID) + references CCM_CMS.PERSONS; + +alter table CCM_CMS.PERSON_NAMES_AUD + add constraint FKtqtlwx8pa9ydh009sudtpfxie + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.PERSON_NAMES_AUD + add constraint FKs6m8tgbp8agrd5q3klwbtcujg + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.PERSONS + add constraint FKiv4ydysjekfx64pkb5v4vd9yj + foreign key (OBJECT_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; + +alter table CCM_CMS.PERSONS_AUD + add constraint FKpup1q3295qkuovaptq8aj5lxp + foreign key (OBJECT_ID, REV) + references CCM_CMS.CONTACTABLE_ENTITIES_AUD; \ No newline at end of file diff --git a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_20__persons_orga_assets.sql b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_20__persons_orga_assets.sql index 7e06caeef..c829fde63 100644 --- a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_20__persons_orga_assets.sql +++ b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_20__persons_orga_assets.sql @@ -1,5 +1,5 @@ create table CCM_CMS.CONTACT_ENTRIES ( - CONTACT_ENTRY_ID int8 not null, + CONTACT_ENTRY_ID int8 not null, ENTRY_KEY varchar(255) not null, ENTRY_ORDER int8, ENTRY_VALUE varchar(4096), @@ -7,30 +7,87 @@ create table CCM_CMS.CONTACT_ENTRIES ( primary key (CONTACT_ENTRY_ID) ); + create table CCM_CMS.CONTACT_ENTRIES_AUD ( + CONTACT_ENTRY_ID int8 not null, + REV int4 not null, + REVTYPE int2, + REVEND int4, + ENTRY_KEY varchar(255), + ENTRY_ORDER int8, + ENTRY_VALUE varchar(4096), + primary key (CONTACT_ENTRY_ID, REV) +); + create table CCM_CMS.CONTACTABLE_ENTITIES ( - OBJECT_ID int8 not null, + OBJECT_ID int8 not null, POSTAL_ADDRESS_ID int8, primary key (OBJECT_ID) ); +create table CCM_CMS.CONTACTABLE_ENTITIES_AUD ( + OBJECT_ID int8 not null, + REV int4 not null, + POSTAL_ADDRESS_ID int8, + primary key (OBJECT_ID, REV) +); + +create table CCM_CMS.ContactableEntity_ContactEntry_AUD ( + REV int4 not null, + CONTACTABLE_ID int8 not null, + CONTACT_ENTRY_ID int8 not null, + REVTYPE int2, + REVEND int4, + primary key (REV, CONTACTABLE_ID, CONTACT_ENTRY_ID) +); + create table CCM_CMS.ORGANIZATIONS ( - NAME varchar(1024), + NAME varchar(1024), OBJECT_ID int8 not null, primary key (OBJECT_ID) ); +create table CCM_CMS.ORGANIZATIONS_AUD ( + OBJECT_ID int8 not null, + REV int4 not null, + NAME varchar(1024), + primary key (OBJECT_ID, REV) +); + create table CCM_CMS.PERSONS ( - BIRTHDATA date, - GIVEN_NAME varchar(255), - NAME_PREFIX varchar(255), - SUFFIX varchar(255), - SURNAME varchar(255), + BIRTHDATE date, OBJECT_ID int8 not null, primary key (OBJECT_ID) ); + create table CCM_CMS.PERSONS_AUD ( + OBJECT_ID int8 not null, + REV int4 not null, + BIRTHDATE date, + primary key (OBJECT_ID, REV) +); + +Create table CCM_CMS.PERSON_NAMES ( + PERSON_ID int8 not null, + GIVEN_NAME varchar(255), + NAME_PREFIX varchar(255), + SUFFIX varchar(255), + SURNAME varchar(255) +); + +create table CCM_CMS.PERSON_NAMES_AUD ( + REV int4 not null, + REVTYPE int2 not null, + PERSON_ID int8 not null, + REVEND int4, + SURNAME varchar(255), + NAME_PREFIX varchar(255), + GIVEN_NAME varchar(255), + SUFFIX varchar(255), + primary key (REV, REVTYPE, PERSON_ID) +); + create table CCM_CMS.POSTAL_ADDRESSES ( - ADDRESS varchar(2048), + ADDRESS varchar(2048), CITY varchar(512), ISO_COUNTRY_CODE varchar(10), POSTAL_CODE varchar(255), @@ -39,32 +96,88 @@ create table CCM_CMS.POSTAL_ADDRESSES ( primary key (OBJECT_ID) ); -alter table CCM_CMS.CONTACT_ENTRIES - add constraint FKfm16ni25r5iscfcyqhlyo4y24 - foreign key (CONTACTABLE_ID) - references CONTACTABLE_ENTITY; + create table CCM_CMS.POSTAL_ADDRESSES_AUD ( + OBJECT_ID int8 not null, + REV int4 not null, + ADDRESS varchar(2048), + CITY varchar(512), + ISO_COUNTRY_CODE varchar(10), + POSTAL_CODE varchar(255), + ADDRESS_STATE varchar(255), + primary key (OBJECT_ID, REV) +); -alter table CCM_CMS.CONTACTABLE_ENTITY - add constraint FKn7nb0chctw8ih05kguf2s4jh0 - foreign key (POSTAL_ADDRESS_ID) - references POSTAL_ADDRESSES; + alter table CCM_CMS.CONTACT_ENTRIES + add constraint FKljrrfco44damal9eaqrnfam0m + foreign key (CONTACTABLE_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; -alter table CCM_CMS.CONTACTABLE_ENTITY - add constraint FK37gvl3x07envs4u4lwustuyge - foreign key (OBJECT_ID) - references CCM_CMS.ASSETS; +alter table CCM_CMS.CONTACT_ENTRIES_AUD + add constraint FKib8xp3ab8kdkc0six36f99e2g + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.CONTACT_ENTRIES_AUD + add constraint FKrse7ibjqsfnny5t1b2tqqs3pt + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.CONTACTABLE_ENTITIES + add constraint FKqefwowr9adclj3xvpfje9rddr + foreign key (POSTAL_ADDRESS_ID) + references CCM_CMS.POSTAL_ADDRESSES; + +alter table CCM_CMS.CONTACTABLE_ENTITIES + add constraint FKhdwlhf3jp8wf5wxjkoynrcspj + foreign key (OBJECT_ID) + references CCM_CMS.ASSETS; + +alter table CCM_CMS.CONTACTABLE_ENTITIES_AUD + add constraint FKjx8trfvt96fkdn6bafnh839id + foreign key (OBJECT_ID, REV) + references CCM_CMS.ASSETS_AUD; + +alter table CCM_CMS.ContactableEntity_ContactEntry_AUD + add constraint FKs5tfdp1auj9ocgvfa9ivec517 + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.ContactableEntity_ContactEntry_AUD + add constraint FKskn2ovg24tnnnwd2o8y0biyje + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; alter table CCM_CMS.ORGANIZATIONS - add constraint FKjjcnjs0eecrla6eqq8fes8o86 - foreign key (OBJECT_ID) - references CONTACTABLE_ENTITY; + add constraint FK77ig0to48xrlfx8qsc0vlfsp6 + foreign key (OBJECT_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; -alter table CCM_CMS.PERSONS - add constraint FK3i2r1w7qc1ofdn4jlbak7vkpu - foreign key (OBJECT_ID) - references CONTACTABLE_ENTITY; +alter table CCM_CMS.ORGANIZATIONS_AUD + add constraint FKp0k3bf008pih96sguio80siql + foreign key (OBJECT_ID, REV) + references CCM_CMS.CONTACTABLE_ENTITIES_AUD; -alter table CCM_CMS.POSTAL_ADDRESSES - add constraint FK4vajjjjo8ro0wns58t8f3i782 - foreign key (OBJECT_ID) - references CCM_CMS.ASSETS; \ No newline at end of file +alter table CCM_CMS.PERSON_NAMES + add constraint FK2yluyhmpuhwxafcbna6u8txrt + foreign key (PERSON_ID) + references CCM_CMS.PERSONS; + +alter table CCM_CMS.PERSON_NAMES_AUD + add constraint FKtqtlwx8pa9ydh009sudtpfxie + foreign key (REV) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.PERSON_NAMES_AUD + add constraint FKs6m8tgbp8agrd5q3klwbtcujg + foreign key (REVEND) + references CCM_CORE.CCM_REVISIONS; + +alter table CCM_CMS.PERSONS + add constraint FKiv4ydysjekfx64pkb5v4vd9yj + foreign key (OBJECT_ID) + references CCM_CMS.CONTACTABLE_ENTITIES; + +alter table CCM_CMS.PERSONS_AUD + add constraint FKpup1q3295qkuovaptq8aj5lxp + foreign key (OBJECT_ID, REV) + references CCM_CMS.CONTACTABLE_ENTITIES_AUD; \ No newline at end of file diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties index 2a443c878..1113dfadf 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties @@ -540,3 +540,4 @@ cms.ui.pages.index_page_model=PageModel for index page cms.ui.pages.item_page_model=Page Model for item page cms.ui.pages.tab.pages=Pages cms.ui.pages.tab.page_models=Page Models +cms.ui.assets.organization.name=Name of the organization diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties index af1aa22ee..5d096acf9 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties @@ -537,3 +537,4 @@ cms.ui.pages.index_page_model=PageModel f\u00fcr Index Seite cms.ui.pages.item_page_model=Page Model f\u00fcr Item Seite cms.ui.pages.tab.pages=Seiten cms.ui.pages.tab.page_models=Page Models +cms.ui.assets.organization.name=Name der Organization diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties index f7a30df3a..48d036edc 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties @@ -499,3 +499,4 @@ cms.ui.pages.index_page_model=PageModel for index page cms.ui.pages.item_page_model=Page Model for item page cms.ui.pages.tab.pages=Pages cms.ui.pages.tab.page_models=Page Models +cms.ui.assets.organization.name=Name of the organization diff --git a/ccm-cms/src/main/resources/org/librecms/assets/Assets.properties b/ccm-cms/src/main/resources/org/librecms/assets/Assets.properties index ba4025fa1..dbab8fe6e 100644 --- a/ccm-cms/src/main/resources/org/librecms/assets/Assets.properties +++ b/ccm-cms/src/main/resources/org/librecms/assets/Assets.properties @@ -17,3 +17,7 @@ video_asset.label=Video video_asset.description=A video image.label=Image image.description=An image file in a web compatible format (PNG, JPEG, GIF, SVG) +organization.label=Organization +organization.desc=Stores data about an organization +person.label=Person +person.desc=Data about a person diff --git a/ccm-cms/src/main/resources/org/librecms/assets/Assets_de.properties b/ccm-cms/src/main/resources/org/librecms/assets/Assets_de.properties index 80a745627..02b1942b3 100644 --- a/ccm-cms/src/main/resources/org/librecms/assets/Assets_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/assets/Assets_de.properties @@ -17,3 +17,7 @@ video_asset.label=Video video_asset.description=A video image.label=Bild image.description=An Bild-Datei in einem web-kompatiblen Format (PNG, JPEG, GIF, SVG) +organization.label=Organisation +organization.desc=Kontakt-) Daten einer Organisation +person.label=Person +person.desc=Daten zu einer Person diff --git a/ccm-core/src/main/java/org/libreccm/categorization/Category.java b/ccm-core/src/main/java/org/libreccm/categorization/Category.java index 6d6dbc3cd..713e6b7b7 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/Category.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/Category.java @@ -402,8 +402,8 @@ public class Category extends CcmObject implements Serializable, Exportable { int hash = super.hashCode(); hash = 23 * hash + Objects.hashCode(uniqueId); hash = 23 * hash + Objects.hashCode(name); - hash = 23 * hash + Objects.hashCode(title); - hash = 23 * hash + Objects.hashCode(description); +// hash = 23 * hash + Objects.hashCode(title); +// hash = 23 * hash + Objects.hashCode(description); hash = 23 * hash + (enabled ? 1 : 0); hash = 23 * hash + (visible ? 1 : 0); hash = 23 * hash + (abstractCategory ? 1 : 0); @@ -439,12 +439,12 @@ public class Category extends CcmObject implements Serializable, Exportable { if (!Objects.equals(name, other.getName())) { return false; } - if (!Objects.equals(title, other.getTitle())) { - return false; - } - if (!Objects.equals(description, other.getDescription())) { - return false; - } +// if (!Objects.equals(title, other.getTitle())) { +// return false; +// } +// if (!Objects.equals(description, other.getDescription())) { +// return false; +// } if (enabled != other.isEnabled()) { return false; } @@ -469,14 +469,14 @@ public class Category extends CcmObject implements Serializable, Exportable { public String toString(final String data) { return super.toString(String.format(", uniqueId = %s, " + "name = \"%s\", " - + "title = %s, " +// + "title = %s, " + "enabled = %b, " + "visible = %b, " + "abstractCategory = %s, " + "categoryOrder = %d%s", uniqueId, name, - Objects.toString(title), +// Objects.toString(title), enabled, visible, abstractCategory, diff --git a/ccm-core/src/main/java/org/libreccm/configuration/LocalizedStringSetting.java b/ccm-core/src/main/java/org/libreccm/configuration/LocalizedStringSetting.java index 0851cf5fa..5a40dbcb5 100644 --- a/ccm-core/src/main/java/org/libreccm/configuration/LocalizedStringSetting.java +++ b/ccm-core/src/main/java/org/libreccm/configuration/LocalizedStringSetting.java @@ -20,12 +20,17 @@ package org.libreccm.configuration; import org.libreccm.l10n.LocalizedString; -import javax.persistence.*; import java.io.Serializable; import java.util.Objects; import static org.libreccm.core.CoreConstants.DB_SCHEMA; +import javax.persistence.AssociationOverride; +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; + /** * A setting which stores a {@link LocalizedString} . This can be used for * storing values for text in the user interface which should be customisable by diff --git a/ccm-core/src/main/java/org/libreccm/configuration/StringListSetting.java b/ccm-core/src/main/java/org/libreccm/configuration/StringListSetting.java index 773a1f51a..478324e36 100644 --- a/ccm-core/src/main/java/org/libreccm/configuration/StringListSetting.java +++ b/ccm-core/src/main/java/org/libreccm/configuration/StringListSetting.java @@ -18,13 +18,19 @@ */ package org.libreccm.configuration; -import javax.persistence.*; + import java.util.ArrayList; import java.util.List; import java.util.Objects; import static org.libreccm.core.CoreConstants.DB_SCHEMA; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; + /** * Setting for a list of strings. In contrast to the {@link EnumSetting} which * uses a {@link java.util.Set} a list maintains the order of its elements.