Fixed another potential lazy init exception

ccm-docs
Jens Pelzetter 2020-03-12 11:21:27 +01:00
parent 4c56554e06
commit 280ddbecb7
4 changed files with 155 additions and 38 deletions

View File

@ -18,8 +18,11 @@
*/ */
package com.arsdigita.cms.ui.authoring.news; package com.arsdigita.cms.ui.authoring.news;
import org.libreccm.l10n.GlobalizationHelper;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionRepository; import org.librecms.contentsection.ContentSectionRepository;
@ -32,13 +35,18 @@ import javax.inject.Inject;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import org.libreccm.security.PermissionChecker; import org.libreccm.security.PermissionChecker;
import org.libreccm.security.Role; import org.libreccm.security.Role;
import org.libreccm.security.RoleRepository; import org.libreccm.security.RoleRepository;
import org.libreccm.security.Shiro; import org.libreccm.security.Shiro;
import org.libreccm.security.User; import org.libreccm.security.User;
import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.ContentTypeRepository; import org.librecms.contentsection.ContentTypeRepository;
import org.librecms.contenttypes.News;
import java.util.Locale;
/** /**
* Controller class for the {@link NewItemForm}. * Controller class for the {@link NewItemForm}.
@ -76,11 +84,11 @@ class NewItemFormController {
} }
final List<Role> roles = user.get().getRoleMemberships().stream() final List<Role> roles = user.get().getRoleMemberships().stream()
.map(membership -> membership.getRole()) .map(membership -> membership.getRole())
.collect(Collectors.toList()); .collect(Collectors.toList());
final TypedQuery<Boolean> query = entityManager.createNamedQuery( final TypedQuery<Boolean> query = entityManager.createNamedQuery(
"ContentSection.hasUsableContentTypes", Boolean.class); "ContentSection.hasUsableContentTypes", Boolean.class);
query.setParameter("section", section); query.setParameter("section", section);
query.setParameter("roles", roles); query.setParameter("roles", roles);
query.setParameter("isSysAdmin", permissionChecker.isPermitted("*")); query.setParameter("isSysAdmin", permissionChecker.isPermitted("*"));
@ -98,12 +106,12 @@ class NewItemFormController {
} }
final List<Role> roles = user.get().getRoleMemberships().stream() final List<Role> roles = user.get().getRoleMemberships().stream()
.map(membership -> membership.getRole()) .map(membership -> membership.getRole())
.collect(Collectors.toList()); .collect(Collectors.toList());
final TypedQuery<ContentType> query = entityManager.createNamedQuery( final TypedQuery<ContentType> query = entityManager.createNamedQuery(
"ContentSection.findUsableContentTypes", "ContentSection.findUsableContentTypes",
ContentType.class); ContentType.class);
query.setParameter("section", section); query.setParameter("section", section);
query.setParameter("roles", roles); query.setParameter("roles", roles);
query.setParameter("isSysAdmin", permissionChecker.isPermitted("*")); query.setParameter("isSysAdmin", permissionChecker.isPermitted("*"));
@ -111,4 +119,6 @@ class NewItemFormController {
return query.getResultList(); return query.getResultList();
} }
} }

View File

@ -0,0 +1,108 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.arsdigita.cms.ui.authoring.news;
import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contenttypes.News;
import java.util.Date;
import java.util.Locale;
import java.util.Objects;
import javax.inject.Inject;
import javax.transaction.Transactional;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class NewsController {
@Inject
private ContentItemRepository itemRepo;
@Transactional
protected String getDescription(
final News fromNews, final Locale forLocale
) {
Objects.requireNonNull(fromNews);
final News news = itemRepo
.findById(fromNews.getObjectId(), News.class)
.orElseThrow(
() -> new IllegalArgumentException(
String.format(
"No News with ID %d available.", fromNews.getObjectId()
)
)
);
return news.getDescription().getValue(forLocale);
}
@Transactional
protected String getText(final News fromNews, final Locale forLocale) {
Objects.requireNonNull(fromNews);
final News news = itemRepo
.findById(fromNews.getObjectId(), News.class)
.orElseThrow(
() -> new IllegalArgumentException(
String.format(
"No News with ID %d available",
fromNews.getObjectId()
)
)
);
return news.getText().getValue(forLocale);
}
@Transactional
protected void updateText(
final News ofNews,
final Locale forLocale,
final String text
) {
Objects.requireNonNull(ofNews);
final News news = itemRepo
.findById(ofNews.getObjectId(), News.class)
.orElseThrow(
() -> new IllegalArgumentException(
String.format(
"No News with ID %d available",
ofNews.getObjectId()
)
)
);
news.getText().addValue(forLocale, text);
itemRepo.save(news);
}
@Transactional
protected void update(
final News news,
final Date releaseDate,
final Locale locale,
final String description
) {
Objects.requireNonNull(news);
final News update = itemRepo
.findById(news.getObjectId(), News.class)
.orElseThrow(
() -> new IllegalArgumentException(
String.format(
"No News with ID %d available",
news.getObjectId()
)
)
);
update.setReleaseDate(releaseDate);
update.getDescription().addValue(locale, description);
itemRepo.save(update);
}
}

View File

@ -36,7 +36,6 @@ import org.librecms.contenttypes.News;
import com.arsdigita.cms.ui.authoring.BasicPageForm; import com.arsdigita.cms.ui.authoring.BasicPageForm;
import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil; import com.arsdigita.cms.ui.authoring.SelectedLanguageUtil;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
@ -45,6 +44,7 @@ import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contenttypes.NewsConfig; import org.librecms.contenttypes.NewsConfig;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
@ -181,7 +181,10 @@ public class NewsPropertyForm extends BasicPageForm
releaseDateSelector.addYear(releaseDate); releaseDateSelector.addYear(releaseDate);
data.put(NEWS_DATE, releaseDate); data.put(NEWS_DATE, releaseDate);
data.put(LEAD, item.getDescription().getValue(selectedLocale)); final NewsController controller = CdiUtil
.createCdiUtil()
.findBean(NewsController.class);
data.put(LEAD, controller.getDescription(item, selectedLocale));
} }
/** /**
@ -218,21 +221,15 @@ public class NewsPropertyForm extends BasicPageForm
.getSaveButton() .getSaveButton()
.isSelected(event.getPageState())) { .isSelected(event.getPageState())) {
final NewsController controller = CdiUtil
.createCdiUtil()
.findBean(NewsController.class);
final Date releaseDate = (java.util.Date) data.get(NEWS_DATE);
final String description = (String) data.get(LEAD);
final Locale selectedLocale = SelectedLanguageUtil final Locale selectedLocale = SelectedLanguageUtil
.selectedLocale(state, selectedLanguageParam); .selectedLocale(state, selectedLanguageParam);
controller.update(item, releaseDate, selectedLocale, description);
item.setReleaseDate((java.util.Date) data.get(NEWS_DATE));
item
.getDescription()
.addValue(
selectedLocale,
(String) data.get(LEAD));
final ContentItemRepository itemRepo = CdiUtil
.createCdiUtil()
.findBean(ContentItemRepository.class);
itemRepo.save(item);
} }
if (propertiesStep != null) { if (propertiesStep != null) {
propertiesStep.maybeForwardToNextStep(event.getPageState()); propertiesStep.maybeForwardToNextStep(event.getPageState());

View File

@ -83,10 +83,13 @@ public class NewsTextBody extends TextBody {
final News news = getSelectedNews(state); final News news = getSelectedNews(state);
return news final NewsController controller = CdiUtil
.getText() .createCdiUtil()
.getValue(SelectedLanguageUtil .findBean(NewsController.class);
.selectedLocale(state, selectedLanguageParam)); return controller.getText(
news,
SelectedLanguageUtil.selectedLocale(state, selectedLanguageParam)
);
} }
@Override @Override
@ -97,11 +100,10 @@ public class NewsTextBody extends TextBody {
final Locale selectedLocale = SelectedLanguageUtil final Locale selectedLocale = SelectedLanguageUtil
.selectedLocale(state, selectedLanguageParam); .selectedLocale(state, selectedLanguageParam);
news.getText().addValue(selectedLocale, text); final NewsController controller = CdiUtil
final ContentItemRepository itemRepo = CdiUtil
.createCdiUtil() .createCdiUtil()
.findBean(ContentItemRepository.class); .findBean(NewsController.class);
itemRepo.save(news); controller.updateText(news, selectedLocale, text);
} }
} }