From 68f3351138f3f31a912ce332a2f5da3eca586ad5 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Thu, 12 Mar 2020 12:11:31 +0100 Subject: [PATCH] Fixed several potential lazy init execeptions in forms for MPA --- .../MultiPartArticleEditForm.java | 8 +- .../MultiPartArticleForm.java | 9 ++- .../MultiPartArticleFormController.java | 65 +++++++++++++++- ...MultiPartArticleSectionStepController.java | 74 ++++++++++++++++++- .../MultiPartArticleSectionsStep.java | 11 ++- .../multipartarticle/SectionDeleteForm.java | 10 ++- .../multipartarticle/SectionEditForm.java | 36 ++++++--- .../multipartarticle/SectionTableModel.java | 16 +++- 8 files changed, 198 insertions(+), 31 deletions(-) diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleEditForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleEditForm.java index dee3e4cb3..a7c7fa2db 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleEditForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleEditForm.java @@ -129,15 +129,15 @@ public class MultiPartArticleEditForm extends MultiPartArticleForm .selectedLocale(state, selectedLanguageParam); final String newName = (String) data.get(MultiPartArticleForm.NAME); - final String oldName = article.getName().getValue(selectedLocale); + final MultiPartArticleFormController controller = CdiUtil + .createCdiUtil() + .findBean(MultiPartArticleFormController.class); + final String oldName = controller.getName(article, selectedLocale); final boolean valid; if (newName.equalsIgnoreCase(oldName)) { valid = true; } else { - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); - final MultiPartArticleFormController controller = cdiUtil - .findBean(MultiPartArticleFormController.class); final Optional folder = controller.getArticleFolder(article); if (folder.isPresent()) { valid = validateNameUniqueness(folder.get(), event); diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleForm.java index 4edcdd0a3..966c17a3d 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleForm.java @@ -233,14 +233,17 @@ public abstract class MultiPartArticleForm final Locale selectedLocale = SelectedLanguageUtil .selectedLocale(state, selectedLanguageParam); + final MultiPartArticleFormController controller = CdiUtil + .createCdiUtil() + .findBean(MultiPartArticleFormController.class); if (article != null) { - data.put(NAME, article.getName().getValue(selectedLocale)); - data.put(TITLE, article.getTitle().getValue(selectedLocale)); + data.put(NAME, controller.getName(article, selectedLocale)); + data.put(TITLE, controller.getTitle(article, selectedLocale)); if (!CMSConfig.getConfig().isHideLaunchDate()) { data.put(LAUNCH_DATE, article.getLaunchDate()); } - data.put(SUMMARY, article.getSummary().getValue(selectedLocale)); + data.put(SUMMARY, controller.getSummary(article, selectedLocale)); } return article; diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleFormController.java index 803a91461..001fecdac 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleFormController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleFormController.java @@ -24,6 +24,8 @@ import org.librecms.contentsection.ContentItemRepository; import org.librecms.contentsection.Folder; import org.librecms.contenttypes.MultiPartArticle; +import java.util.Locale; +import java.util.Objects; import java.util.Optional; import javax.enterprise.context.RequestScoped; @@ -46,8 +48,9 @@ public class MultiPartArticleFormController { @Transactional(Transactional.TxType.REQUIRED) protected Optional getArticleFolder(final MultiPartArticle article) { - final Optional mpa = itemRepo - .findById(article.getObjectId()); + final Optional mpa = itemRepo.findById( + article.getObjectId() + ); if (mpa.isPresent()) { return itemManager.getItemFolder(mpa.get()); @@ -56,4 +59,62 @@ public class MultiPartArticleFormController { } } + @Transactional(Transactional.TxType.REQUIRED) + public String getName( + final MultiPartArticle fromMpa, final Locale forLocale + ) { + Objects.requireNonNull(fromMpa); + Objects.requireNonNull(forLocale); + final MultiPartArticle mpa = itemRepo + .findById(fromMpa.getObjectId(), MultiPartArticle.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No MultiPartArticle with ID %d available", + fromMpa.getObjectId() + ) + ) + ); + return mpa.getName().getValue(forLocale); + } + + @Transactional(Transactional.TxType.REQUIRED) + public String getTitle( + final MultiPartArticle fromMpa, final Locale forLocale + ) { + Objects.requireNonNull(fromMpa); + Objects.requireNonNull(forLocale); + final MultiPartArticle mpa = itemRepo + .findById(fromMpa.getObjectId(), MultiPartArticle.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No MultiPartArticle with ID %d available", + fromMpa.getObjectId() + ) + ) + ); + + return mpa.getTitle().getValue(forLocale); + } + + @Transactional(Transactional.TxType.REQUIRED) + public String getSummary( + final MultiPartArticle fromMpa, final Locale forLocale + ) { + Objects.requireNonNull(fromMpa); + Objects.requireNonNull(forLocale); + final MultiPartArticle mpa = itemRepo + .findById(fromMpa.getObjectId(), MultiPartArticle.class) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No MultiPartArticle with ID %d available", + fromMpa.getObjectId() + ) + ) + ); + return mpa.getSummary().getValue(forLocale); + } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionStepController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionStepController.java index c9b8b7a78..bae2e3915 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionStepController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionStepController.java @@ -25,6 +25,8 @@ import org.librecms.contenttypes.MultiPartArticleSectionManager; import org.librecms.contenttypes.MultiPartArticleSectionRepository; import java.util.List; +import java.util.Locale; +import java.util.Objects; import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; @@ -127,15 +129,81 @@ class MultiPartArticleSectionStepController { protected void moveAfter(final MultiPartArticle article, final MultiPartArticleSection section, final MultiPartArticleSection after) { - + final MultiPartArticle theArticle = itemRepo .findById(article.getObjectId(), MultiPartArticle.class) .orElseThrow(() -> new IllegalArgumentException(String.format( "No MultiPartArticle with ID %d in the database.", article.getObjectId()))); - + sectionManager.moveSectionAfter(theArticle, section, after); } - + + @Transactional(Transactional.TxType.REQUIRED) + public String getSectionTitle( + final MultiPartArticleSection ofSection, final Locale forLocale + ) { + Objects.requireNonNull(ofSection); + Objects.requireNonNull(forLocale); + + final MultiPartArticleSection section = sectionRepo + .findById(ofSection.getSectionId()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No section with ID %d available.", ofSection + .getSectionId() + ) + ) + ); + return section.getTitle().getValue(forLocale); + } + + @Transactional(Transactional.TxType.REQUIRED) + public String getSectionText( + final MultiPartArticleSection ofSection, final Locale forLocale + ) { + Objects.requireNonNull(ofSection); + Objects.requireNonNull(forLocale); + + final MultiPartArticleSection section = sectionRepo + .findById(ofSection.getSectionId()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No section with ID %d available.", ofSection + .getSectionId() + ) + ) + ); + return section.getText().getValue(forLocale); + } + + @Transactional(Transactional.TxType.REQUIRED) + public void updateSection( + final MultiPartArticleSection section, + final String title, + final String text, + final boolean pageBreak, + final Locale locale + ) { + Objects.requireNonNull(section); + Objects.requireNonNull(locale); + + final MultiPartArticleSection update = sectionRepo + .findById(section.getSectionId()) + .orElseThrow( + () -> new IllegalArgumentException( + String.format( + "No section with ID %d available.", + section.getSectionId() + ) + ) + ); + update.getTitle().addValue(locale, title); + update.getText().addValue(locale, title); + update.setPageBreak(pageBreak); + } + } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionsStep.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionsStep.java index e7e0318aa..b4ff8fff1 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionsStep.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/MultiPartArticleSectionsStep.java @@ -158,11 +158,16 @@ public class MultiPartArticleSectionsStep extends ResettableContainer { final Locale selectedLocale = SelectedLanguageUtil .selectedLocale(state, selectedLanguageParam); + final MultiPartArticleSectionStepController controller = CdiUtil + .createCdiUtil() + .findBean(MultiPartArticleSectionStepController.class); + final Object[] parameterObj = { + controller.getSectionTitle( moveSectionModel - .getSelectedSection(state) - .getTitle() - .getValue(selectedLocale) + .getSelectedSection(state), + selectedLocale + ) }; target.setLabel(new GlobalizedMessage( diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionDeleteForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionDeleteForm.java index ca9cde32f..b5707bdd5 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionDeleteForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionDeleteForm.java @@ -35,7 +35,6 @@ import com.arsdigita.globalization.GlobalizedMessage; import org.librecms.contenttypes.MultiPartArticle; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.libreccm.cdi.utils.CdiUtil; @@ -110,9 +109,14 @@ public class SectionDeleteForm extends Form final Locale selectedLocale = SelectedLanguageUtil .selectedLocale(state, selectedLanguageParam); + final MultiPartArticleSectionStepController controller = CdiUtil + .createCdiUtil() + .findBean(MultiPartArticleSectionStepController.class); + sectionNameLabel.setLabel( - section.getTitle().getValue(selectedLocale), - state); + controller.getSectionTitle(section, selectedLocale), + state + ); } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionEditForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionEditForm.java index c27afce4d..2eec3eb52 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionEditForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionEditForm.java @@ -198,12 +198,19 @@ public class SectionEditForm extends Form { final Locale selectedLocale = SelectedLanguageUtil .selectedLocale(state, selectedLanguageParam); + final MultiPartArticleSectionStepController controller = CdiUtil + .createCdiUtil() + .findBean(MultiPartArticleSectionStepController.class); final MultiPartArticleSection section = selectedSectionModel .getSelectedSection(state); - data.put(TITLE, section.getTitle().getValue(selectedLocale)); - data.put(TEXT, section.getText().getValue(selectedLocale)); + data.put( + TITLE, controller.getSectionTitle(section, selectedLocale) + ); + data.put( + TEXT, controller.getSectionText(section, selectedLocale) + ); if (section.isPageBreak()) { data.put(PAGE_BREAK, new Object[]{"true"}); @@ -281,9 +288,8 @@ public class SectionEditForm extends Form { section = selectedSectionModel.getSelectedSection(state); } - section.getTitle().addValue(selectedLocale, - (String) data.get(TITLE)); - +// section.getTitle().addValue(selectedLocale, +// (String) data.get(TITLE)); final Object[] pageBreakVal = (Object[]) data.get(PAGE_BREAK); final boolean pageBreak; if (pageBreakVal == null @@ -293,7 +299,7 @@ public class SectionEditForm extends Form { } else { pageBreak = true; } - section.setPageBreak(pageBreak); +// section.setPageBreak(pageBreak); final String text; if (data.get(TEXT) == null) { @@ -301,12 +307,24 @@ public class SectionEditForm extends Form { } else { text = (String) data.get(TEXT); } - section.getText().addValue(selectedLocale, text); - - sectionRepo.save(section); +// section.getText().addValue(selectedLocale, text); +// sectionRepo.save(section); if (selectedSectionModel.getSelectedKey(state) == null) { + section.getTitle().addValue(selectedLocale, + (String) data.get(TITLE)); + section.setPageBreak(pageBreak); + section.getText().addValue(selectedLocale, text); + controller.addSection(article, section); + } else { + controller.updateSection( + section, + (String) data.get(TITLE), + text, + pageBreak, + selectedLocale + ); } if (sectionsStep != null) { diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionTableModel.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionTableModel.java index 621a2820b..de8084d7a 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionTableModel.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/multipartarticle/SectionTableModel.java @@ -34,6 +34,7 @@ import org.librecms.contenttypes.MultiPartArticleSection; import java.util.Iterator; import java.util.List; +import java.util.Locale; class SectionTableModel implements TableModel { @@ -109,13 +110,20 @@ class SectionTableModel implements TableModel { if (columnModel == null) { return null; } + + final MultiPartArticleSectionStepController controller = CdiUtil + .createCdiUtil() + .findBean(MultiPartArticleSectionStepController.class); switch (columnIndex) { case SectionTable.COL_INDEX_TITLE: - return currentSection - .getTitle() - .getValue(SelectedLanguageUtil - .selectedLocale(pageState, selectedLanguageParam)); + return controller.getSectionTitle( + currentSection, + SelectedLanguageUtil.selectedLocale( + pageState, selectedLanguageParam + ) + ) + ; case SectionTable.COL_PAGE_BREAK: if (currentSection.isPageBreak()) { return new Label(