From f7b91d72f5e5bdd55866889992fe74213d13ea19 Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 26 Jul 2019 15:26:57 +0000 Subject: [PATCH] CCM NG: Assets git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@6155 8810af33-2d31-482b-a856-94f89814c4df --- .../cms/ui/assets/AbstractAssetForm.java | 45 ++-- .../assets/AbstractAssetFormController.java | 46 ++++- .../cms/ui/assets/AssetFormController.java | 8 +- .../cms/ui/assets/AssetSearchWidget.java | 32 +-- .../assets/AssetSearchWidgetController.java | 82 ++++++++ .../ui/assets/forms/AbstractBookmarkForm.java | 2 + .../forms/AbstractContactableEntityForm.java | 69 ++++--- ...stractContactableEntityFormController.java | 25 ++- .../ui/assets/forms/AudioFormController.java | 6 +- .../assets/forms/BookmarkFormController.java | 7 +- .../ExternalAudioAssetFormController.java | 5 - .../ExternalVideoAssetFormController.java | 5 - .../assets/forms/FileAssetFormController.java | 6 - .../ui/assets/forms/ImageFormController.java | 17 +- .../ui/assets/forms/LegalMetadataForm.java | 5 +- .../forms/LegalMetadataFormController.java | 10 +- .../cms/ui/assets/forms/OrganizationForm.java | 6 +- .../forms/OrganizationFormController.java | 5 - .../cms/ui/assets/forms/PersonForm.java | 31 ++- .../ui/assets/forms/PersonFormController.java | 21 +- .../ui/assets/forms/PostalAddressForm.java | 111 ++++++++++ .../forms/PostalAddressFormController.java | 82 ++++++++ .../cms/ui/assets/forms/SideNoteForm.java | 2 + .../assets/forms/SideNoteFormController.java | 7 +- .../cms/ui/assets/forms/VideoForm.java | 5 +- .../ui/assets/forms/VideoFormController.java | 6 - .../assets/ContactEntryRepository.java | 57 +++++ .../assets/ContactableEntityManager.java | 32 +-- .../main/java/org/librecms/assets/Person.java | 5 +- .../org/librecms/assets/PersonManager.java | 15 +- .../org/librecms/assets/PostalAddress.java | 8 + .../h2/V7_0_0_23__fix_contact_entries.sql | 1 + .../pgsql/V7_0_0_23__fix_contact_entries.sql | 1 + .../org/librecms/CmsResources.properties | 12 ++ .../org/librecms/CmsResources_de.properties | 12 ++ .../org/librecms/CmsResources_fr.properties | 12 ++ .../org/librecms/assets/Assets.properties | 2 + .../org/librecms/assets/Assets_de.properties | 2 + .../scripts/002_create_ccm_cms_tables.sql | 195 +++++++++++++++++- .../scripts/002_create_ccm_cms_tables.sql | 195 +++++++++++++++++- 40 files changed, 971 insertions(+), 224 deletions(-) create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidgetController.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/PostalAddressForm.java create mode 100644 ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/PostalAddressFormController.java create mode 100644 ccm-cms/src/main/java/org/librecms/assets/ContactEntryRepository.java create mode 100644 ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_23__fix_contact_entries.sql create mode 100644 ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_23__fix_contact_entries.sql diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetForm.java index 4d4dc8b38..87eaae99c 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetForm.java @@ -150,12 +150,7 @@ public abstract class AbstractAssetForm target.clearOptions(); - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - @SuppressWarnings("unchecked") - final AbstractAssetFormController controller - = cdiUtil - .findBean(AbstractAssetFormController.class); - final List availableLocales = controller + final List availableLocales = getController() .availableLocales(selectedAssetId, getAssetClass()); availableLocales.sort((locale1, locale2) -> { @@ -213,13 +208,7 @@ public abstract class AbstractAssetForm target.clearOptions(); - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - @SuppressWarnings("unchecked") - final AbstractAssetFormController controller - = cdiUtil - .findBean(AbstractAssetFormController.class); - - final List creatableLocales = controller + final List creatableLocales = getController() .creatableLocales(selectedAssetId, getAssetClass()); creatableLocales.sort((locale1, locale2) -> { @@ -302,17 +291,15 @@ public abstract class AbstractAssetForm } else { - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - @SuppressWarnings("unchecked") - final AbstractAssetFormController controller = cdiUtil - .findBean(AbstractAssetFormController.class); showLocaleSelect.setValue(state, getSelectedLocale(state)); - data = controller.getAssetData(selectedAssetId, - getAssetClass(), - getSelectedLocale(state)); + data = getController().getAssetData(selectedAssetId, + getAssetClass(), + getSelectedLocale(state)); + name.setValue(state, + data.get(AbstractAssetFormController.DISPLAY_NAME)); title.setValue(state, data.get(AbstractAssetFormController.TITLE)); } @@ -343,14 +330,13 @@ public abstract class AbstractAssetForm if (!data.isEmpty()) { - name.setValue(state, + name.setValue(state, data.get(AbstractAssetFormController.DISPLAY_NAME)); // final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); // @SuppressWarnings("unchecked") // final AbstractAssetFormController controller = cdiUtil // .findBean(AbstractAssetFormController.class); - title.setValue(state, data.get(AbstractAssetFormController.TITLE)); showLocale(state); @@ -385,7 +371,6 @@ public abstract class AbstractAssetForm if (saveCancelSection.getSaveButton().isSelected(state)) { - final Long selectedAssetId = getSelectedAssetId(state); final Map data = new HashMap<>(); data.put(AbstractAssetFormController.DISPLAY_NAME, name.getValue(state)); @@ -393,6 +378,20 @@ public abstract class AbstractAssetForm title.getValue(state)); data.putAll(collectData(event)); + final Long selectedAssetId; + if (getSelectedAssetId(state) == null) { + + selectedAssetId = getController() + .createAsset(assetPane + .getFolderSelectionModel() + .getSelectedObject(state), + getSelectedLocale(state), + getAssetClass(), + data); + } else { + selectedAssetId = getSelectedAssetId(state); + } + getController().updateAsset(selectedAssetId, getSelectedLocale(state), getAssetClass(), diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetFormController.java index a6581ef63..f14b6fbb8 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetFormController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetFormController.java @@ -20,7 +20,9 @@ package com.arsdigita.cms.ui.assets; import org.librecms.assets.AssetL10NManager; import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AssetManager; import org.librecms.contentsection.AssetRepository; +import org.librecms.contentsection.Folder; import java.util.ArrayList; import java.util.HashMap; @@ -44,6 +46,9 @@ public abstract class AbstractAssetFormController implements protected static final String DISPLAY_NAME = "displayName"; protected static final String TITLE = "title"; + @Inject + private AssetManager assetManager; + @Inject private AssetRepository assetRepository; @@ -79,13 +84,43 @@ public abstract class AbstractAssetFormController implements data.put(TITLE, asset.getTitle().getValue(selectedLocale)); data.putAll(getAssetData(asset, selectedLocale)); - + return data; } protected abstract Map getAssetData( final T asset, final Locale selectedLocale); + @Transactional(Transactional.TxType.REQUIRED) + @Override + public long createAsset(final Folder infolder, + final Locale selectedLocale, + final Class assetType, + final Map data) { + + if (!data.containsKey(DISPLAY_NAME)) { + throw new IllegalArgumentException( + "data does not contain a value for displayName."); + } + + if (!data.containsKey(TITLE)) { + throw new IllegalArgumentException( + "data does not contain a value for title."); + } + + final String name = (String) data.get(DISPLAY_NAME); + final String title = (String) data.get(TITLE); + + final T asset = assetManager + .createAsset(name, + title, + selectedLocale, + infolder, + assetType); + + return asset.getObjectId(); + } + /** * Updates the provided asset with the provided data. * @@ -109,18 +144,11 @@ public abstract class AbstractAssetFormController implements final Class assetType, final Map data) { - Objects.requireNonNull(assetId, "Can't update asset null."); Objects.requireNonNull(selectedLocale, "Can't get update asset for locale null."); Objects.requireNonNull(data, "Can't update asset without data."); - final T asset; - if (assetId == null) { - asset = createAsset(); - } else { - asset = loadAsset(assetId, assetType); - } - + final T asset = loadAsset(assetId, assetType); if (data.containsKey(DISPLAY_NAME)) { asset.setDisplayName((String) data.get(DISPLAY_NAME)); } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormController.java index c63e3e502..c188d613a 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormController.java @@ -19,6 +19,7 @@ package com.arsdigita.cms.ui.assets; import org.librecms.contentsection.Asset; +import org.librecms.contentsection.Folder; import java.util.List; import java.util.Locale; @@ -70,7 +71,12 @@ public interface AssetFormController { Class assetType, Map data); - T createAsset(); + long createAsset(Folder inFolder, + Locale selectedLocale, + Class assetType, + Map data); + + /** * Determines in which locales the provided asset is available. diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidget.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidget.java index 95a91073a..8b95bc58d 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidget.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidget.java @@ -32,6 +32,7 @@ import org.librecms.contentsection.Asset; import org.librecms.contentsection.AssetRepository; import org.librecms.contentsection.ContentSection; +import java.util.Map; import java.util.ResourceBundle; /** @@ -91,33 +92,20 @@ public class AssetSearchWidget extends Widget { final Long value = (Long) getValue(state); if (value != null) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final AssetRepository assetRepo = cdiUtil - .findBean(AssetRepository.class); - final AssetTypesManager typesManager = cdiUtil - .findBean(AssetTypesManager.class); - final GlobalizationHelper globalizationHelper = cdiUtil - .findBean(GlobalizationHelper.class); + final AssetSearchWidgetController controller = cdiUtil + .findBean(AssetSearchWidgetController.class); - final Asset asset = assetRepo - .findById(value) - .orElseThrow(() -> new IllegalArgumentException(String.format( - "No Asset with ID %d in the database.", value))); + final Map data = controller.getData(value); final Element selected = widget .newChildElement("cms:selected-asset", CMS.CMS_XML_NS); - selected.addAttribute("assetId", - Long.toString(asset.getObjectId())); selected.addAttribute( - "title", - globalizationHelper - .getValueFromLocalizedString(asset.getTitle())); - final AssetTypeInfo typeInfo = typesManager - .getAssetTypeInfo(asset.getClass().getName()); - final ResourceBundle bundle = ResourceBundle - .getBundle(typeInfo.getLabelBundle(), - globalizationHelper.getNegotiatedLocale()); - final String typeLabel = bundle.getString(typeInfo.getLabelKey()); - selected.addAttribute("type", typeLabel); + "assetId", data.get(AssetSearchWidgetController.OBJECT_ID) + ); + selected.addAttribute("title", + data.get(AssetSearchWidgetController.TITLE)); + selected.addAttribute("type", + data.get(AssetSearchWidgetController.TYPE)); exportAttributes(widget); } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidgetController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidgetController.java new file mode 100644 index 000000000..cac64adad --- /dev/null +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidgetController.java @@ -0,0 +1,82 @@ +/* + * 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; + +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.assets.AssetTypeInfo; +import org.librecms.assets.AssetTypesManager; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AssetRepository; + +import java.util.HashMap; +import java.util.Map; +import java.util.ResourceBundle; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +public class AssetSearchWidgetController { + + protected static final String OBJECT_ID = "objectId"; + protected static final String TYPE = "type"; + protected static final String TITLE = "title"; + + @Inject + private AssetRepository assetRepository; + + @Inject + private AssetTypesManager typesManager; + + @Inject + private GlobalizationHelper globalizationHelper; + + @Transactional(Transactional.TxType.REQUIRED) + public Map getData(final long assetId) { + + final Asset asset = assetRepository + .findById(assetId) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No Asset with ID %d in the database.", assetId))); + + final Map data = new HashMap<>(); + + data.put(OBJECT_ID, Long.toString(asset.getObjectId())); + + data.put(TITLE, + globalizationHelper + .getValueFromLocalizedString(asset.getTitle())); + final AssetTypeInfo typeInfo = typesManager + .getAssetTypeInfo(asset.getClass().getName()); + final ResourceBundle bundle = ResourceBundle + .getBundle(typeInfo.getLabelBundle(), + globalizationHelper.getNegotiatedLocale()); + final String typeLabel = bundle.getString(typeInfo.getLabelKey()); + + data.put(TYPE, typeLabel); + + return data; + } + +} diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBookmarkForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBookmarkForm.java index 413e7c83d..a18ac5f22 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBookmarkForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractBookmarkForm.java @@ -97,6 +97,8 @@ public abstract class AbstractBookmarkForm protected void initForm(final PageState state, final Map data) { + super.initForm(state, data); + if (!data.isEmpty()) { description 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 5a48e1a7c..c271e493c 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,7 +18,6 @@ */ package com.arsdigita.cms.ui.assets.forms; - import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.Component; import com.arsdigita.bebop.ControlLink; @@ -56,8 +55,10 @@ import org.librecms.assets.ContactEntryKey; import org.librecms.assets.ContactableEntity; import org.librecms.assets.PostalAddress; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.TooManyListenersException; import static org.librecms.CmsConstants.*; @@ -76,8 +77,6 @@ public abstract class AbstractContactableEntityForm private static final int COL_CONTACT_ENTRIES_REMOVE = 2; - private final AssetPane assetPane; - private SimpleContainer contactEntriesContainer; private Table contactEntriesTable; @@ -93,8 +92,6 @@ public abstract class AbstractContactableEntityForm public AbstractContactableEntityForm(final AssetPane assetPane) { super(assetPane); - - this.assetPane = assetPane; } @Override @@ -158,27 +155,46 @@ public abstract class AbstractContactableEntityForm } @Override - public void init(final FormSectionEvent event) throws FormProcessException { + public void initForm(final PageState state, + final Map data) { - super.init(event); - - final PageState state = event.getPageState(); + super.initForm(state, data); final Long selectedAssetId = getSelectedAssetId(state); if (selectedAssetId != null) { - // ToDo - throw new UnsupportedOperationException(); + + postalAddressSearchWidget.setValue( + state, + data.get(AbstractContactableEntityFormController.POSTAL_ADDRESS) + ); } } + @Override + protected Map collectData( + final FormSectionEvent event) { + + final PageState state = event.getPageState(); + + final Map data = new HashMap<>(); + + if (postalAddressSearchWidget.getValue(state) != null) { + + data.put(AbstractContactableEntityFormController.POSTAL_ADDRESS, + postalAddressSearchWidget.getValue(state)); + } + + return data; + } + @Override public void process(final FormSectionEvent event) throws FormProcessException { final PageState state = event.getPageState(); - if (addContactEntryLink.equals(event.getSource())) { + if (addContactEntryLink.isSelected(state)) { final Long selectedAssetId = getSelectedAssetId(state); if (selectedAssetId == null) { @@ -197,11 +213,11 @@ public abstract class AbstractContactableEntityForm final String value = (String) contactEntryValueField.getValue(state); controller.addContactEntry(key, value, selectedAssetId); + + contactEntryKeySelect.setValue(state, null); + contactEntryValueField.setValue(state, null); } else { super.process(event); - - final Object selectedPostal = postalAddressSearchWidget - .getValue(state); } } @@ -384,6 +400,7 @@ public abstract class AbstractContactableEntityForm return new ControlLink((Component) value); } + } private class ContactEntryKeySelectPrintListener implements PrintListener { @@ -400,21 +417,15 @@ public abstract class AbstractContactableEntityForm CMS_BUNDLE))) ); - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final AbstractContactableEntityFormController controller = cdiUtil - .findBean(AbstractContactableEntityFormController.class); - final GlobalizationHelper globalizationHelper = cdiUtil - .findBean(GlobalizationHelper.class); - final List keys = controller - .findAvailableContactEntryKeys(); + final AbstractContactableEntityFormController controller = (AbstractContactableEntityFormController) getController(); + + final PageState state = event.getPageState(); + + final List keys = controller + .findAvailableContactEntryKeys(getSelectedLocale(state)); - for (final ContactEntryKey key : keys) { - - final Text label = new Text( - globalizationHelper - .getValueFromLocalizedString(key.getLabel())); - - target.addOption(new Option(key.getEntryKey(), label)); + for (final String[] key : keys) { + target.addOption(new Option(key[0], new Text(key[1]))); } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityFormController.java index 819850088..4cfebbf64 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityFormController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AbstractContactableEntityFormController.java @@ -121,16 +121,12 @@ public abstract class AbstractContactableEntityFormController new IllegalArgumentException(String.format( "No ContactEntity with ID %d found.", contactableId))); - entity + return entity .getContactEntries() .stream() .map(contactEntry -> toContactEntryArray(contactEntry, selectedLocale)) .collect(Collectors.toList()); - - final List entries = new ArrayList<>(); - - return entries; } private String[] toContactEntryArray(final ContactEntry entry, @@ -189,15 +185,26 @@ public abstract class AbstractContactableEntityFormController findAvailableContactEntryKeys() { - - final Locale locale = globalizationHelper.getNegotiatedLocale(); + public List findAvailableContactEntryKeys( + final Locale selectedLocale) { return keyRepository .findAll() .stream() - .sorted(new ContactEntryKeyByLabelComparator(locale)) + .sorted(new ContactEntryKeyByLabelComparator(selectedLocale)) + .map(key -> buildContactEntryKeyArray(key, + selectedLocale)) .collect(Collectors.toList()); } + private String[] buildContactEntryKeyArray( + final ContactEntryKey contactEntryKey, final Locale selectedLocale) { + + final String key = contactEntryKey.getEntryKey(); + final String label = contactEntryKey.getLabel().getValue(selectedLocale); + + return new String[]{key, label}; + + } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AudioFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AudioFormController.java index d9de53782..a7bf6c172 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AudioFormController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/AudioFormController.java @@ -23,6 +23,7 @@ import com.arsdigita.cms.ui.assets.IsControllerForAssetType; import org.librecms.assets.AudioAsset; import org.librecms.assets.LegalMetadata; import org.librecms.contentsection.AssetRepository; +import org.librecms.contentsection.Folder; import java.util.Locale; import java.util.Map; @@ -43,11 +44,6 @@ public class AudioFormController extends AbstractBinaryAssetFormController