From ae08029745976a80dafe4e1ec0406d7f884df59a Mon Sep 17 00:00:00 2001 From: Charles Severance Date: Tue, 4 Feb 2025 14:24:12 -0500 Subject: [PATCH] Support transversalMap per Earle's review --- .../impl/BaseAnnouncementService.java | 9 ++++++--- .../assignment/impl/AssignmentServiceImpl.java | 4 ++-- .../calendar/impl/BaseCalendarService.java | 2 +- .../impl/ConversationsServiceImpl.java | 2 +- .../impl/ConversationsTestConfiguration.java | 5 +++-- .../org/sakaiproject/lti/api/LTIService.java | 2 +- .../sakaiproject/lti/impl/BaseLTIService.java | 16 ++++++++++++---- .../DiscussionForumServiceImpl.java | 2 +- .../poll/service/impl/PollListManagerImpl.java | 11 +++++------ .../app/syllabus/SyllabusServiceImpl.java | 2 +- 10 files changed, 33 insertions(+), 22 deletions(-) diff --git a/announcement/announcement-impl/impl/src/java/org/sakaiproject/announcement/impl/BaseAnnouncementService.java b/announcement/announcement-impl/impl/src/java/org/sakaiproject/announcement/impl/BaseAnnouncementService.java index 695ae5a48541..cdc5a0c45c71 100644 --- a/announcement/announcement-impl/impl/src/java/org/sakaiproject/announcement/impl/BaseAnnouncementService.java +++ b/announcement/announcement-impl/impl/src/java/org/sakaiproject/announcement/impl/BaseAnnouncementService.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.HashMap; import java.util.Map.Entry; import java.util.Optional; import java.util.Stack; @@ -1480,6 +1481,8 @@ protected String getSummaryFromHeader(Message item, MessageHeader header) { */ public Map transferCopyEntities(String fromContext, String toContext, List resourceIds, List options) { + Map transversalMap = new HashMap<>(); + // get the channel associated with this site String oChannelRef = channelReference(fromContext, SiteService.MAIN_CONTAINER); AnnouncementChannel oChannel = null; @@ -1555,7 +1558,7 @@ public Map transferCopyEntities(String fromContext, String toCon // the "to" message nMessage = (AnnouncementMessageEdit) nChannel.addMessage(); String newBody = oMessage.getBody(); - newBody = ltiService.fixLtiLaunchUrls(newBody, fromContext, toContext); + newBody = ltiService.fixLtiLaunchUrls(newBody, fromContext, toContext, transversalMap); newBody = linkMigrationHelper.migrateOneLink(fromContext, toContext, newBody); nMessage.setBody(newBody); // message header @@ -1674,8 +1677,8 @@ public Map transferCopyEntities(String fromContext, String toCon { log.warn(".importResources(): exception in handling {} : {}", serviceName(), any); } - - return null; + + return transversalMap; } @Override diff --git a/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java b/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java index ee83bc08d735..e6abc287b04a 100644 --- a/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java +++ b/assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java @@ -4254,7 +4254,7 @@ public Map transferCopyEntities(String fromContext, String toCon nAssignment.setTitle(oAssignment.getTitle()); // replace all occurrence of old context with new context inside instruction text if(StringUtils.isNotBlank(oAssignment.getInstructions())){ - String newInstructions = ltiService.fixLtiLaunchUrls(oAssignment.getInstructions(), fromContext, toContext); + String newInstructions = ltiService.fixLtiLaunchUrls(oAssignment.getInstructions(), fromContext, toContext, transversalMap); nAssignment.setInstructions(newInstructions.replaceAll(fromContext, toContext)); } nAssignment.setTypeOfGrade(oAssignment.getTypeOfGrade()); @@ -4616,7 +4616,7 @@ public Map transferCopyEntities(String fromContext, String toCon } transversalMap.putAll(transferCopyEntities(fromContext, toContext, ids, transferOptions)); } catch (Exception e) { - log.info("End removing Assignmentt data {}", e.getMessage()); + log.info("End removing Assignment data {}", e.getMessage()); } return transversalMap; diff --git a/calendar/calendar-impl/impl/src/java/org/sakaiproject/calendar/impl/BaseCalendarService.java b/calendar/calendar-impl/impl/src/java/org/sakaiproject/calendar/impl/BaseCalendarService.java index 963b70f2c357..e6dd6de4cbbe 100644 --- a/calendar/calendar-impl/impl/src/java/org/sakaiproject/calendar/impl/BaseCalendarService.java +++ b/calendar/calendar-impl/impl/src/java/org/sakaiproject/calendar/impl/BaseCalendarService.java @@ -1918,7 +1918,7 @@ public Map transferCopyEntities(String fromContext, String toCon continue; String description = oEvent.getDescriptionFormatted(); - description = ltiService.fixLtiLaunchUrls(description, fromContext, toContext); + description = ltiService.fixLtiLaunchUrls(description, fromContext, toContext, transversalMap); oEvent.setDescriptionFormatted(description); CalendarEvent e = nCalendar.addEvent(oEvent.getRange(), oEvent.getDisplayName(), oEvent.getDescriptionFormatted(), diff --git a/conversations/impl/src/main/java/org/sakaiproject/conversations/impl/ConversationsServiceImpl.java b/conversations/impl/src/main/java/org/sakaiproject/conversations/impl/ConversationsServiceImpl.java index 42bce0999436..658242832838 100644 --- a/conversations/impl/src/main/java/org/sakaiproject/conversations/impl/ConversationsServiceImpl.java +++ b/conversations/impl/src/main/java/org/sakaiproject/conversations/impl/ConversationsServiceImpl.java @@ -2627,7 +2627,7 @@ public Map transferCopyEntities(String fromContext, String toCon newBean.id = fromBean.id; newBean.title = fromBean.title; - newBean.message = ltiService.fixLtiLaunchUrls(fromBean.message, fromContext, toContext); + newBean.message = ltiService.fixLtiLaunchUrls(fromBean.message, fromContext, toContext, traversalMap); newBean.siteId = toContext; newBean.draft = true; newBean.type = fromBean.type; diff --git a/conversations/impl/src/test/org/sakaiproject/conversations/impl/ConversationsTestConfiguration.java b/conversations/impl/src/test/org/sakaiproject/conversations/impl/ConversationsTestConfiguration.java index 1a2faef171a1..869d377d6f88 100644 --- a/conversations/impl/src/test/org/sakaiproject/conversations/impl/ConversationsTestConfiguration.java +++ b/conversations/impl/src/test/org/sakaiproject/conversations/impl/ConversationsTestConfiguration.java @@ -18,9 +18,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.ArgumentMatchers.anyString; - +import static org.mockito.ArgumentMatchers.any; import java.io.IOException; import java.util.Properties; +import java.util.Map; import javax.annotation.Resource; import javax.sql.DataSource; @@ -308,7 +309,7 @@ public GradingService gradingService() { @Bean(name = "org.sakaiproject.lti.api.LTIService") public LTIService ltiService() { LTIService ltiService = mock(LTIService.class); - when(ltiService.fixLtiLaunchUrls(anyString(), anyString(), anyString())) + when(ltiService.fixLtiLaunchUrls(anyString(), anyString(), anyString(), any(Map.class))) .thenAnswer(invocation -> invocation.getArgument(0)); return ltiService; } diff --git a/lti/lti-api/src/java/org/sakaiproject/lti/api/LTIService.java b/lti/lti-api/src/java/org/sakaiproject/lti/api/LTIService.java index e83f23bb4904..93c8e56230cc 100644 --- a/lti/lti-api/src/java/org/sakaiproject/lti/api/LTIService.java +++ b/lti/lti-api/src/java/org/sakaiproject/lti/api/LTIService.java @@ -649,7 +649,7 @@ public interface LTIService extends LTISubstitutionsFilter { * @param toContext The destination context * @return The text with updated LTI launch URLs */ - String fixLtiLaunchUrls(String text, String fromContext, String toContext); + String fixLtiLaunchUrls(String text, String fromContext, String toContext, Map transversalMap); /** * Fix LTI launch URLs when copying content between contexts diff --git a/lti/lti-impl/src/java/org/sakaiproject/lti/impl/BaseLTIService.java b/lti/lti-impl/src/java/org/sakaiproject/lti/impl/BaseLTIService.java index bf04b352bd23..2b8934983687 100644 --- a/lti/lti-impl/src/java/org/sakaiproject/lti/impl/BaseLTIService.java +++ b/lti/lti-impl/src/java/org/sakaiproject/lti/impl/BaseLTIService.java @@ -1267,18 +1267,19 @@ public Long getId(Map thing) { @Override public String fixLtiLaunchUrls(String text, String toContext, Map> ltiContentItems) { String fromContext = null; - return fixLtiLaunchUrls(text, fromContext, toContext, ltiContentItems); + Map transversalMap = null; + return fixLtiLaunchUrls(text, fromContext, toContext, ltiContentItems, transversalMap); } @Override - public String fixLtiLaunchUrls(String text, String fromContext, String toContext) { + public String fixLtiLaunchUrls(String text, String fromContext, String toContext, Map transversalMap) { Map> ltiContentItems = null; - return fixLtiLaunchUrls(text, fromContext, toContext, ltiContentItems); + return fixLtiLaunchUrls(text, fromContext, toContext, ltiContentItems, transversalMap); } // http://localhost:8080/access/lti/site/7d529bf7-b856-4400-9da1-ba8670ed1489/content:1 // http://localhost:8080/access/lti/site/7d529bf7-b856-4400-9da1-ba8670ed1489/content:42 - protected String fixLtiLaunchUrls(String text, String fromContext, String toContext, Map> ltiContentItems) { + protected String fixLtiLaunchUrls(String text, String fromContext, String toContext, Map> ltiContentItems, Map transversalMap) { if (StringUtils.isBlank(text)) return text; List urls = SakaiLTIUtil.extractLtiLaunchUrls(text); for (String url : urls) { @@ -1287,6 +1288,12 @@ protected String fixLtiLaunchUrls(String text, String fromContext, String toCont String linkSiteId = pieces[0]; String linkContextId = pieces[1]; + if ( transversalMap != null && transversalMap.containsKey(url) ) { + log.debug("Found transversal map entry for {} -> {}", url, transversalMap.get(url)); + text = text.replace(url, transversalMap.get(url)); + return text; + } + // We need to load up the content item from the old context which should be successful Long contentKey = Long.parseLong(linkContextId); Map content = this.getContent(contentKey, linkSiteId); @@ -1312,6 +1319,7 @@ protected String fixLtiLaunchUrls(String text, String fromContext, String toCont // Upgrade the access prefix from legacy blti to modern lti String newUrl = baseUrl.replace(LTIService.LAUNCH_PREFIX_LEGACY, LTIService.LAUNCH_PREFIX) + toContext + "/content:" + newContentId; text = text.replace(url, newUrl); + transversalMap.put(url, newUrl); log.debug("Inserted content item {} in site {} newUrl {}", newContentId, toContext, newUrl); } else { log.error("Could not insert content item {} in site {}",contentKey,toContext); diff --git a/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/DiscussionForumServiceImpl.java b/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/DiscussionForumServiceImpl.java index a9b1471df21d..b279be9c4cdc 100644 --- a/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/DiscussionForumServiceImpl.java +++ b/msgcntr/messageforums-component-impl/src/java/org/sakaiproject/component/app/messageforums/DiscussionForumServiceImpl.java @@ -653,7 +653,7 @@ public Map transferCopyEntities(String fromContext, String toCon } if (fromTopic.getExtendedDescription() != null && fromTopic.getExtendedDescription().length() > 0) { String extendedDescription = fromTopic.getExtendedDescription(); - extendedDescription = ltiService.fixLtiLaunchUrls(extendedDescription, fromContext, toContext); + extendedDescription = ltiService.fixLtiLaunchUrls(extendedDescription, fromContext, toContext, transversalMap); newTopic.setExtendedDescription(extendedDescription); } newTopic.setLocked(fromTopic.getLocked()); diff --git a/polls/impl/src/java/org/sakaiproject/poll/service/impl/PollListManagerImpl.java b/polls/impl/src/java/org/sakaiproject/poll/service/impl/PollListManagerImpl.java index 232d7883210d..aab37c5834b2 100644 --- a/polls/impl/src/java/org/sakaiproject/poll/service/impl/PollListManagerImpl.java +++ b/polls/impl/src/java/org/sakaiproject/poll/service/impl/PollListManagerImpl.java @@ -31,6 +31,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.HashMap; import java.util.Set; import java.util.Stack; import java.util.UUID; @@ -50,9 +51,7 @@ import org.sakaiproject.entity.api.Entity; import org.sakaiproject.entity.api.EntityManager; import org.sakaiproject.entity.api.EntityTransferrer; -import org.sakaiproject.entity.api.HttpAccess; import org.sakaiproject.entity.api.Reference; -import org.sakaiproject.entity.api.ResourceProperties; import org.sakaiproject.genericdao.api.search.Order; import org.sakaiproject.genericdao.api.search.Restriction; import org.sakaiproject.genericdao.api.search.Search; @@ -573,7 +572,7 @@ public Map transferCopyEntities(String fromContext, String toCon @Override public Map transferCopyEntities(String fromContext, String toContext, List resourceIds, List transferOptions) { - + Map transversalMap = new HashMap<>(); try { for (Poll fromPoll : findAllPolls(fromContext)) { Poll fromPollV = getPollWithVotes(fromPoll.getPollId()); @@ -589,7 +588,7 @@ public Map transferCopyEntities(String fromContext, String toCon toPoll.setDisplayResult(fromPollV.getDisplayResult()); toPoll.setLimitVoting(fromPollV.getLimitVoting()); String details = fromPollV.getDetails(); - details = ltiService.fixLtiLaunchUrls(details, fromContext, toContext); + details = ltiService.fixLtiLaunchUrls(details, fromContext, toContext, transversalMap); toPoll.setDetails(details); //Guardamos toPoll para que se puedan ir aƱandiƩndole las opciones y los votos @@ -606,7 +605,7 @@ public Map transferCopyEntities(String fromContext, String toCon toOption.setOptionOrder(fromOption.getOptionOrder()); String text = fromOption.getText(); - text = ltiService.fixLtiLaunchUrls(text, fromContext, toContext); + text = ltiService.fixLtiLaunchUrls(text, fromContext, toContext, transversalMap); toOption.setText(text); saveOption(toOption); @@ -628,7 +627,7 @@ public Map transferCopyEntities(String fromContext, String toCon log.error("Failed to save transfer polls: {}", e.toString()); } - return null; + return transversalMap; } diff --git a/syllabus/syllabus-impl/src/java/org/sakaiproject/component/app/syllabus/SyllabusServiceImpl.java b/syllabus/syllabus-impl/src/java/org/sakaiproject/component/app/syllabus/SyllabusServiceImpl.java index df1ef066898b..0b9e395395a6 100644 --- a/syllabus/syllabus-impl/src/java/org/sakaiproject/component/app/syllabus/SyllabusServiceImpl.java +++ b/syllabus/syllabus-impl/src/java/org/sakaiproject/component/app/syllabus/SyllabusServiceImpl.java @@ -1059,7 +1059,7 @@ else if (fromSyllabusItem.getRedirectURL() !=null) { .intValue() + 1); String assetStr = sd.getAsset(); - assetStr = ltiService.fixLtiLaunchUrls(assetStr, fromContext, toContext); + assetStr = ltiService.fixLtiLaunchUrls(assetStr, fromContext, toContext, transversalMap); sd.setAsset(assetStr); SyllabusData newToSyData = syllabusManager