Skip to content

Commit

Permalink
SAK-40235 Forums correct issues with EntityManager changes (sakaiproj…
Browse files Browse the repository at this point in the history
  • Loading branch information
ern authored and Miguel Pellicer committed Aug 23, 2018
1 parent 17d78a4 commit cae0afc
Show file tree
Hide file tree
Showing 14 changed files with 108 additions and 103 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.sakaiproject.hibernate;

import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;

public class HibernateUtils {
/**
* THIS CAN BE REMOVED WHEN SAKAI IS ON HIBERNATE >= 5.2.10
*
* Unproxies a {@link HibernateProxy}. If the proxy is uninitialized, it automatically triggers an initialization.
* In case the supplied object is null or not a proxy, the object will be returned as-is.
*
* @param proxy the {@link HibernateProxy} to be unproxied
* @return the proxy's underlying implementation object, or the supplied object otherwise
*/
public static Object unproxy(Object proxy) {
if ( proxy instanceof HibernateProxy ) {
HibernateProxy hibernateProxy = (HibernateProxy) proxy;
LazyInitializer initializer = hibernateProxy.getHibernateLazyInitializer();
return initializer.getImplementation();
} else {
return proxy;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ public interface AreaManager
* Save an area
* @param area
*/
public void saveArea(Area area);
public void saveArea(Area area, String currentUser);
public Area saveArea(Area area);
public Area saveArea(Area area, String currentUser);

/**
* Create an area of the given type in the given context
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
**********************************************************************************/
package org.sakaiproject.api.app.messageforums;

import java.util.Collection;
import java.util.List;


Expand Down Expand Up @@ -101,7 +100,7 @@ public interface MessageForumsForumManager {
public void saveDiscussionForum(DiscussionForum forum);
public void saveDiscussionForum(DiscussionForum forum, boolean draft);
public void saveDiscussionForum(DiscussionForum forum, boolean draft, boolean logEvent);
public void saveDiscussionForum(DiscussionForum forum, boolean draft, boolean logEvent, String currentUser);
public DiscussionForum saveDiscussionForum(DiscussionForum forum, boolean draft, boolean logEvent, String currentUser);


/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
import java.util.List;
import java.util.Set;

import org.sakaiproject.api.app.messageforums.PermissionsMask;

public interface PermissionLevelManager {
public static final String PERMISSION_LEVEL_NAME_OWNER = "Owner";
public static final String PERMISSION_LEVEL_NAME_AUTHOR = "Author";
Expand Down Expand Up @@ -105,6 +103,6 @@ public interface PermissionLevelManager {
public List getCustomPermissions();
public List getAllMembershipItemsForForumsForSite(final Long areaId);
public List getAllMembershipItemsForTopicsForSite(final Long areaId);
public void deleteMembershipItems(Set membershipSet);
public void deleteMembershipItems(Set<DBMembershipItem> membershipSet);

}
Original file line number Diff line number Diff line change
Expand Up @@ -281,21 +281,21 @@ public interface DiscussionForumManager
* Save a forum. If this is a new forum, assumes current context is available.
* @param forum
*/
public void saveForum(DiscussionForum forum);
public void saveForum(DiscussionForum forum, boolean draft, String contextId, boolean logEvent, String currentUser);
public DiscussionForum saveForum(DiscussionForum forum);
public DiscussionForum saveForum(DiscussionForum forum, boolean draft, String contextId, boolean logEvent, String currentUser);

/**
* Saves the given forum object. If forum is new, will be saved in the given contextId
* @param contextId
* @param forum
*/
public void saveForum(String contextId, DiscussionForum forum);
public DiscussionForum saveForum(String contextId, DiscussionForum forum);

/**
* @param object
* @param forum
* @param object
*/
public void saveForumAsDraft(DiscussionForum forum);
public DiscussionForum saveForumAsDraft(DiscussionForum forum);


/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1557,20 +1557,12 @@ private DiscussionForum saveForumSettings(boolean draft)
saveForumAttach(forum);
setObjectPermissions(forum);
if (draft)
forumManager.saveForumAsDraft(forum);
forum = forumManager.saveForumAsDraft(forum);
else
forumManager.saveForum(forum);
//forumManager.saveForumControlPermissions(forum, forumControlPermissions);
//forumManager.saveForumMessagePermissions(forum, forumMessagePermissions);
if (isNew)
{
String forumUuid = forum.getUuid();
forum = null;
forum = forumManager.getForumByUuid(forumUuid);
}else{
if(beforeChangeHM != null){
updateSynopticMessagesForForumComparingOldMessagesCount(getSiteId(), forum.getId(), null, beforeChangeHM, SynopticMsgcntrManager.NUM_OF_ATTEMPTS);
}
forum = forumManager.saveForum(forum);

if (!isNew && beforeChangeHM != null) {
updateSynopticMessagesForForumComparingOldMessagesCount(getSiteId(), forum.getId(), null, beforeChangeHM, SynopticMsgcntrManager.NUM_OF_ATTEMPTS);
}

//RUBRICS, Save the binding between the forum and the rubric
Expand Down
5 changes: 5 additions & 0 deletions msgcntr/messageforums-component-impl/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@
<groupId>org.sakaiproject.scheduler</groupId>
<artifactId>scheduler-api</artifactId>
</dependency>
<dependency>
<groupId>org.sakaiproject.kernel</groupId>
<artifactId>sakai-kernel-private</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<resources>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public Area getPrivateArea(String siteId){
area.setPostFirst(Boolean.FALSE);
area.setAutoMarkThreadsRead(DEFAULT_AUTO_MARK_READ);
area.setSendToEmail(serverConfigurationService.getInt(DEFAULT_SEND_TO_EMAIL_PROP, Area.EMAIL_COPY_OPTIONAL));
saveArea(area);
area = saveArea(area);
}

return area;
Expand Down Expand Up @@ -181,7 +181,7 @@ public Area getDiscussionArea(String contextId, boolean createDefaultForum) {
// this is a Messages tool option
area.setSendToEmail(serverConfigurationService.getInt(DEFAULT_SEND_TO_EMAIL_PROP, Area.EMAIL_COPY_OPTIONAL));
area.setAvailabilityRestricted(Boolean.FALSE);
saveArea(area);
area = saveArea(area);
//if set populate the default Forum and topic
if (createDefaultForum && serverConfigurationService.getBoolean("forums.setDefault.forum", true)) {
setAreaDefaultElements(area);
Expand Down Expand Up @@ -255,17 +255,15 @@ public Area createArea(String typeId, String contextParam) {
* sort index of 0. (if a sort index on a forum is 0 then it is new). If there is a
* zero sort index then it increments all the sort indices by one so the new sort index
* becomes the first without having to rely on the creation date for the sorting.
*
*
* @param area Area to save
*/
public void saveArea(Area area) {
public Area saveArea(Area area) {
String currentUser = getCurrentUser();
saveArea( area, currentUser);
return saveArea( area, currentUser);
}

public void saveArea(Area area, String currentUser){
boolean isNew = area.getId() == null;

public Area saveArea(Area area, String currentUser){
area.setModified(new Date());
area.setModifiedBy(currentUser);

Expand Down Expand Up @@ -295,9 +293,11 @@ public void saveArea(Area area, String currentUser){
// the area will always be available.
area.setAvailability(true);

getHibernateTemplate().saveOrUpdate(area);
area = getHibernateTemplate().merge(area);

log.debug("saveArea executed with areaId: " + area.getId());
log.debug("saveArea executed with areaId: {}", area.getId());

return area;
}

public void deleteArea(Area area) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1346,7 +1346,7 @@ public void updateEntityReferences(String toContext, Map<String, String> transve

if(updateForum){
//update forum
dfManager.saveForum(fromForum, fromForum.getDraft(), toContext, false, currentUserId);
fromForum = dfManager.saveForum(fromForum, fromForum.getDraft(), toContext, false, currentUserId);
}

List topics = fromForum.getTopics();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ public void execute(String opaqueContext) {
String siteId = forumManager.getContextForForumById(forumId);
HashMap<String, Integer> beforeChangeHM = SynopticMsgcntrManagerCover
.getUserToNewMessagesForForumMap(siteId, forum.getId(), null);
forumManager.saveForum(forum, forum.getDraft(), siteId, false, "-forumScheduler-");
forum = forumManager.saveForum(forum, forum.getDraft(), siteId, false, "-forumScheduler-");
updateSynopticMessagesForForumComparingOldMessagesCount(siteId, forum.getId(), null, beforeChangeHM,
SynopticMsgcntrManager.NUM_OF_ATTEMPTS);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import lombok.extern.slf4j.Slf4j;
import org.hibernate.Query;
import org.hibernate.collection.internal.PersistentSet;
import org.sakaiproject.hibernate.HibernateUtils;
import org.springframework.orm.hibernate4.HibernateCallback;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

Expand Down Expand Up @@ -712,11 +713,11 @@ public List getModeratedTopicsInSite(final String contextId) {

if (results != null) {
if (results[0] instanceof Topic) {
tempTopic = (Topic)results[0];
tempTopic.setBaseForum((BaseForum)results[1]);
tempTopic = (Topic) HibernateUtils.unproxy(results[0]);
tempTopic.setBaseForum((BaseForum) HibernateUtils.unproxy(results[1]));
} else {
tempTopic = (Topic)results[1];
tempTopic.setBaseForum((BaseForum)results[0]);
tempTopic = (Topic) HibernateUtils.unproxy(results[1]);
tempTopic.setBaseForum((BaseForum) HibernateUtils.unproxy(results[0]));
}
resultSet.add(tempTopic);
}
Expand Down Expand Up @@ -831,7 +832,7 @@ public void saveDiscussionForum(DiscussionForum forum, boolean draft, boolean lo
saveDiscussionForum(forum, draft, logEvent, currentUser);
}

public void saveDiscussionForum(DiscussionForum forum, boolean draft, boolean logEvent, String currentUser) {
public DiscussionForum saveDiscussionForum(DiscussionForum forum, boolean draft, boolean logEvent, String currentUser) {

boolean isNew = forum.getId() == null;

Expand Down Expand Up @@ -880,9 +881,9 @@ else if(currentUser==null){
}
//make sure availability flag is set properly
forum.setAvailability(ForumScheduleNotificationCover.makeAvailableHelper(forum.getAvailabilityRestricted(), forum.getOpenDate(), forum.getCloseDate()));
getHibernateTemplate().saveOrUpdate(forum);

forum = getHibernateTemplate().merge(forum);

//make sure that any open and close dates are scheduled:
ForumScheduleNotificationCover.scheduleAvailability(forum);

Expand All @@ -894,7 +895,9 @@ else if(currentUser==null){
}
}

log.debug("saveDiscussionForum executed with forumId: " + forum.getId() + ":: draft: " + draft);
log.debug("saveDiscussionForum executed with forumId: {} :: draft: {}", forum.getId(), draft);

return forum;
}

public DiscussionTopic createDiscussionForumTopic(DiscussionForum forum) {
Expand Down Expand Up @@ -963,17 +966,12 @@ public void saveDiscussionForumTopic(DiscussionTopic topic, boolean parentForumD
//make sure availability is set properly
topic.setAvailability(ForumScheduleNotificationCover.makeAvailableHelper(topic.getAvailabilityRestricted(), topic.getOpenDate(), topic.getCloseDate()));

if (topic.getId() == null) {

DiscussionForum discussionForum =
(DiscussionForum) getForumByIdWithTopics(topic.getBaseForum().getId());
discussionForum.addTopic(topic);

saveDiscussionForum(discussionForum, parentForumDraftStatus, logEvent, currentUser);
//sak-5146 saveDiscussionForum(discussionForum, parentForumDraftStatus);

if (isNew) {
DiscussionForum discussionForum = (DiscussionForum) getForumByIdWithTopics(topic.getBaseForum().getId());
discussionForum.addTopic(topic);
saveDiscussionForum(discussionForum, parentForumDraftStatus, logEvent, currentUser);
} else {
getHibernateTemplate().saveOrUpdate(topic);
getHibernateTemplate().update(topic);
}
//now schedule any jobs that are needed for the open/close dates
//this will require having the ID of the topic (if its a new one)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -758,46 +758,33 @@ private void loadDefaultTypeAndPermissionLevelData() {
}
}

public void deleteMembershipItems(Set membershipSet)
{
if(membershipSet != null)
{
Iterator iter = membershipSet.iterator();
Set permissionLevels = new HashSet();
while(iter.hasNext())
{
DBMembershipItem item = (DBMembershipItem) iter.next();
if(item != null && item.getPermissionLevel() != null && PermissionLevelManager.PERMISSION_LEVEL_NAME_CUSTOM.equals(item.getPermissionLevelName()))
{
permissionLevels.add((PermissionLevel)item.getPermissionLevel());
public void deleteMembershipItems(Set<DBMembershipItem> membershipSet) {
if (membershipSet != null) {
Set<PermissionLevel> permissionLevelsToDelete = new HashSet<>();
Set<DBMembershipItem> membershipItemsToDelete = new HashSet<>();
for (DBMembershipItem item : membershipSet) {
if (item != null) {
DBMembershipItem managedItem = getHibernateTemplate().merge(item);
membershipItemsToDelete.add(managedItem);
PermissionLevel managedLevel = managedItem.getPermissionLevel();
if (managedLevel != null) {
switch (managedItem.getPermissionLevelName()) {
case PermissionLevelManager.PERMISSION_LEVEL_NAME_CUSTOM:
case PermissionLevelManager.PERMISSION_LEVEL_NAME_OWNER:
case PermissionLevelManager.PERMISSION_LEVEL_NAME_AUTHOR:
case PermissionLevelManager.PERMISSION_LEVEL_NAME_NONEDITING_AUTHOR:
case PermissionLevelManager.PERMISSION_LEVEL_NAME_CONTRIBUTOR:
case PermissionLevelManager.PERMISSION_LEVEL_NAME_REVIEWER:
case PermissionLevelManager.PERMISSION_LEVEL_NAME_NONE:
getHibernateTemplate().merge(managedLevel);
permissionLevelsToDelete.add(managedLevel);
break;
}
}
}
if(item != null && item.getPermissionLevel() != null && PermissionLevelManager.PERMISSION_LEVEL_NAME_OWNER.equals(item.getPermissionLevelName()))
{
permissionLevels.add((PermissionLevel)item.getPermissionLevel());
}
if(item != null && item.getPermissionLevel() != null && PermissionLevelManager.PERMISSION_LEVEL_NAME_AUTHOR.equals(item.getPermissionLevelName()))
{
permissionLevels.add((PermissionLevel)item.getPermissionLevel());
}
if(item != null && item.getPermissionLevel() != null && PermissionLevelManager.PERMISSION_LEVEL_NAME_NONEDITING_AUTHOR.equals(item.getPermissionLevelName()))
{
permissionLevels.add((PermissionLevel)item.getPermissionLevel());
}
if(item != null && item.getPermissionLevel() != null && PermissionLevelManager.PERMISSION_LEVEL_NAME_CONTRIBUTOR.equals(item.getPermissionLevelName()))
{
permissionLevels.add((PermissionLevel)item.getPermissionLevel());
}
if(item != null && item.getPermissionLevel() != null && PermissionLevelManager.PERMISSION_LEVEL_NAME_REVIEWER.equals(item.getPermissionLevelName()))
{
permissionLevels.add((PermissionLevel)item.getPermissionLevel());
}
if(item != null && item.getPermissionLevel() != null && PermissionLevelManager.PERMISSION_LEVEL_NAME_NONE.equals(item.getPermissionLevelName()))
{
permissionLevels.add((PermissionLevel)item.getPermissionLevel());
}
}
getHibernateTemplate().deleteAll(membershipSet);
getHibernateTemplate().deleteAll(permissionLevels);
getHibernateTemplate().deleteAll(membershipItemsToDelete);
getHibernateTemplate().deleteAll(permissionLevelsToDelete);
}
}

Expand Down
Loading

0 comments on commit cae0afc

Please sign in to comment.