forked from sakaiproject/sakai
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
SAK-41391: Polls > in an Oracle environment poll options are not disp…
…layed in the order they're created (sakaiproject#6593)
- Loading branch information
Showing
18 changed files
with
229 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
142 changes: 142 additions & 0 deletions
142
polls/impl/src/java/org/sakaiproject/poll/logic/impl/PollOrderOptionBackFillJob.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
/** | ||
* Copyright (c) 2003-2019 The Apereo Foundation | ||
* | ||
* Licensed under the Educational Community License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://opensource.org/licenses/ecl2 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package org.sakaiproject.poll.logic.impl; | ||
|
||
import java.util.Comparator; | ||
import java.util.List; | ||
|
||
import lombok.Getter; | ||
import lombok.Setter; | ||
import lombok.extern.slf4j.Slf4j; | ||
|
||
import org.apache.commons.collections4.CollectionUtils; | ||
|
||
import org.quartz.DisallowConcurrentExecution; | ||
import org.quartz.Job; | ||
import org.quartz.JobExecutionContext; | ||
import org.quartz.JobExecutionException; | ||
|
||
import org.sakaiproject.authz.api.SecurityAdvisor; | ||
import org.sakaiproject.authz.api.SecurityService; | ||
import org.sakaiproject.poll.logic.PollListManager; | ||
import org.sakaiproject.poll.model.Option; | ||
import org.sakaiproject.poll.model.Poll; | ||
import org.sakaiproject.site.api.Site; | ||
import org.sakaiproject.site.api.SiteService; | ||
import org.sakaiproject.site.api.SiteService.SelectionType; | ||
import org.sakaiproject.site.api.SiteService.SortType; | ||
|
||
/** | ||
* This Quartz job is responsible for back-filling the 'order' attribute of all existing Poll options. | ||
* It will iterate over all sites in the system, ordered by creation date. It will then request any | ||
* existing Polls for the site, starting with the newest and working backwards, and back-fill the | ||
* 'order' attribute of each poll's options based on the option's original ID value. If the options | ||
* are not null, the job will abort to avoid re-setting already existing orders (in case the job is | ||
* accidentally run more than once). | ||
* | ||
* @author Brian Jones ([email protected]) | ||
*/ | ||
@Slf4j | ||
@DisallowConcurrentExecution | ||
public class PollOrderOptionBackFillJob implements Job | ||
{ | ||
// APIs | ||
@Getter @Setter private SiteService siteService; | ||
@Getter @Setter private SecurityService securityService; | ||
@Getter @Setter private PollListManager pollService; | ||
|
||
private static final SecurityAdvisor YES_MAN = (String userId, String function, String reference) -> SecurityAdvisor.SecurityAdvice.ALLOWED; | ||
|
||
/** | ||
* This is the method that is fired when the job is 'triggered'. | ||
* | ||
* @param jobExecutionContext - the context of the job execution | ||
* @throws JobExecutionException | ||
*/ | ||
@Override | ||
public void execute( JobExecutionContext jobExecutionContext ) throws JobExecutionException | ||
{ | ||
log.info( "Attempting to back-fill all existing Poll option orders..." ); | ||
int modifiedCount = 0; | ||
|
||
// Iterate over sites in the system, ordered by creation date... | ||
List<Site> sites = siteService.getSites( SelectionType.ANY, null, null, null, SortType.CREATED_ON_DESC, null ); | ||
if( !CollectionUtils.isEmpty( sites ) ) | ||
{ | ||
for( Site site : sites ) | ||
{ | ||
String siteID = site.getId(); | ||
List<Poll> pollsForSite = pollService.findAllPolls( siteID ); | ||
if( !CollectionUtils.isEmpty( pollsForSite ) ) | ||
{ | ||
// Iterate over the polls for the site... | ||
for( Poll poll : pollsForSite ) | ||
{ | ||
try | ||
{ | ||
// Iterate over Options in the poll... | ||
securityService.pushAdvisor( YES_MAN ); | ||
List<Option> pollOptions = pollService.getOptionsForPoll( poll ); | ||
if( !CollectionUtils.isEmpty( pollOptions ) ) | ||
{ | ||
// Check if any options have a null order | ||
boolean hasNullOptionOrder = false; | ||
for( Option option : pollOptions ) | ||
{ | ||
if( option.getOptionOrder() == null ) | ||
{ | ||
hasNullOptionOrder = true; | ||
break; | ||
} | ||
} | ||
|
||
// If any of the option's order is null, we need to back-fill them | ||
if( hasNullOptionOrder ) | ||
{ | ||
log.info( "Poll ID {} has options with null order, processing...", poll.getId() ); | ||
|
||
// Order the list by ID | ||
pollOptions.sort( Comparator.comparingLong( Option::getOptionId ) ); | ||
|
||
// Iterate over the list | ||
for( int i = 0; i < pollOptions.size(); i++ ) | ||
{ | ||
// Add order based on ID | ||
Option option = pollOptions.get( i ); | ||
option.setOptionOrder(i); | ||
pollService.saveOption( option ); | ||
modifiedCount++; | ||
log.info( "Option {} ---> new order == {}", option.getId(), i ); | ||
} | ||
} | ||
} | ||
} | ||
catch( Exception ex ) | ||
{ | ||
log.error( "Unexcepted exception", ex ); | ||
} | ||
finally | ||
{ | ||
securityService.popAdvisor( YES_MAN ); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
log.info( "Processing finished, modified {} poll options", modifiedCount ); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.