Skip to content
Snippets Groups Projects
Commit 7053cc2d authored by srosse's avatar srosse
Browse files

Merge remote-tracking branch 'origin/OpenOLAT_15.1' into OpenOLAT_15.2

parents 822b7334 4db81572
No related branches found
No related tags found
No related merge requests found
Showing
with 124 additions and 58 deletions
...@@ -28,6 +28,7 @@ import javax.servlet.ServletException; ...@@ -28,6 +28,7 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.Logger;
import org.olat.core.commons.services.pdf.PdfModule; import org.olat.core.commons.services.pdf.PdfModule;
import org.olat.core.commons.services.pdf.PdfService; import org.olat.core.commons.services.pdf.PdfService;
import org.olat.core.commons.services.pdf.model.PdfDelivery; import org.olat.core.commons.services.pdf.model.PdfDelivery;
...@@ -39,7 +40,6 @@ import org.olat.core.gui.components.Window; ...@@ -39,7 +40,6 @@ import org.olat.core.gui.components.Window;
import org.olat.core.gui.control.creator.ControllerCreator; import org.olat.core.gui.control.creator.ControllerCreator;
import org.olat.core.gui.control.generic.popup.PopupBrowserWindow; import org.olat.core.gui.control.generic.popup.PopupBrowserWindow;
import org.olat.core.id.Roles; import org.olat.core.id.Roles;
import org.apache.logging.log4j.Logger;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
import org.olat.core.util.FileUtils; import org.olat.core.util.FileUtils;
import org.olat.core.util.UserSession; import org.olat.core.util.UserSession;
...@@ -77,32 +77,38 @@ public class PdfDeliveryDispatcher implements Dispatcher { ...@@ -77,32 +77,38 @@ public class PdfDeliveryDispatcher implements Dispatcher {
response.sendError(HttpServletResponse.SC_FORBIDDEN); response.sendError(HttpServletResponse.SC_FORBIDDEN);
return; return;
} }
String uriPrefix = DispatcherModule.getLegacyUriPrefix(request); try {
final String origUri = request.getRequestURI(); String uriPrefix = DispatcherModule.getLegacyUriPrefix(request);
String uuid = origUri.substring(uriPrefix.length()); final String origUri = request.getRequestURI();
int indexSuffix = uuid.indexOf('/'); String uuid = origUri.substring(uriPrefix.length());
int indexSuffix = uuid.indexOf('/');
String key = null;
String filename = null; String key = null;
if(indexSuffix > 0) { String filename = null;
key = uuid.substring(0, indexSuffix); if(indexSuffix > 0) {
filename = uuid.substring(indexSuffix + 1); key = uuid.substring(0, indexSuffix);
} filename = uuid.substring(indexSuffix + 1);
}
PdfDelivery delivery = cache.get(key);
if(delivery == null) { PdfDelivery delivery = cache.get(key);
response.sendError(HttpServletResponse.SC_NOT_FOUND); if(delivery == null) {
} else if(delivery.getDirectory() != null) { response.sendError(HttpServletResponse.SC_NOT_FOUND);
renderFile(delivery, filename, response); } else if(origUri.contains("close-window")) {
} else if(delivery.getControllerCreator() != null) { response.setStatus(HttpServletResponse.SC_OK);
renderController(delivery, request, response); } else if(delivery.getDirectory() != null) {
} else { renderFile(delivery, filename, response);
response.sendError(HttpServletResponse.SC_BAD_REQUEST); } else if(delivery.getControllerCreator() != null) {
renderController(delivery, request, response);
} else {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
} catch (IOException e) {
log.error("", e);
} }
} }
private void renderController(PdfDelivery delivery, HttpServletRequest request, HttpServletResponse response) { private synchronized void renderController(PdfDelivery delivery, HttpServletRequest request, HttpServletResponse response) {
ControllerCreator creator = delivery.getControllerCreator(); ControllerCreator creator = delivery.getControllerCreator();
UserRequest ureq = new UserRequestImpl("pdfd", request, response); UserRequest ureq = new UserRequestImpl("pdfd", request, response);
UserSession usess = ureq.getUserSession(); UserSession usess = ureq.getUserSession();
...@@ -113,9 +119,16 @@ public class PdfDeliveryDispatcher implements Dispatcher { ...@@ -113,9 +119,16 @@ public class PdfDeliveryDispatcher implements Dispatcher {
usess.setRoles(Roles.userRoles()); usess.setRoles(Roles.userRoles());
} }
PopupBrowserWindow pbw = delivery.getWindowControl().getWindowBackOffice() Window window;
.getWindowManager().createNewPopupBrowserWindowFor(ureq, creator); if(delivery.getWindow() == null) {
Window window = pbw.getPopupWindowControl().getWindowBackOffice().getWindow(); PopupBrowserWindow pbw = delivery.getWindowControl().getWindowBackOffice()
.getWindowManager().createNewPopupBrowserWindowFor(ureq, creator);
window = pbw.getPopupWindowControl().getWindowBackOffice().getWindow();
delivery.setWindow(window);
delivery.setBrowserWindow(pbw);
} else {
window = delivery.getWindow();
}
window.dispatchRequest(ureq, true); window.dispatchRequest(ureq, true);
} }
......
...@@ -41,6 +41,7 @@ import org.olat.core.commons.services.pdf.ui.AthenaPdfSettingsController; ...@@ -41,6 +41,7 @@ import org.olat.core.commons.services.pdf.ui.AthenaPdfSettingsController;
import org.olat.core.configuration.AbstractSpringModule; import org.olat.core.configuration.AbstractSpringModule;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Disposable;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.creator.ControllerCreator; import org.olat.core.gui.control.creator.ControllerCreator;
import org.olat.core.helpers.Settings; import org.olat.core.helpers.Settings;
...@@ -143,6 +144,9 @@ public class AthenaPdfSPI extends AbstractSpringModule implements PdfSPI { ...@@ -143,6 +144,9 @@ public class AthenaPdfSPI extends AbstractSpringModule implements PdfSPI {
cache.put(key, delivery); cache.put(key, delivery);
render(key, "index.html", out); render(key, "index.html", out);
cache.remove(key); cache.remove(key);
if(delivery.getBrowserWindow() instanceof Disposable) {
((Disposable)delivery.getBrowserWindow()).dispose();
}
} }
private void render(String key, String rootFilename, OutputStream out) { private void render(String key, String rootFilename, OutputStream out) {
...@@ -184,7 +188,7 @@ public class AthenaPdfSPI extends AbstractSpringModule implements PdfSPI { ...@@ -184,7 +188,7 @@ public class AthenaPdfSPI extends AbstractSpringModule implements PdfSPI {
if(response.getStatusLine().getStatusCode() == 200) { if(response.getStatusLine().getStatusCode() == 200) {
copyResponse(response, out); copyResponse(response, out);
} else { } else {
log.error("Cannot renderer PDF: " + response.getStatusLine().getStatusCode()); log.error("Cannot renderer PDF: {}", response.getStatusLine().getStatusCode());
EntityUtils.consume(response.getEntity()); EntityUtils.consume(response.getEntity());
} }
} catch(IOException e) { } catch(IOException e) {
......
...@@ -21,8 +21,10 @@ package org.olat.core.commons.services.pdf.model; ...@@ -21,8 +21,10 @@ package org.olat.core.commons.services.pdf.model;
import java.io.Serializable; import java.io.Serializable;
import org.olat.core.gui.components.Window;
import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.creator.ControllerCreator; import org.olat.core.gui.control.creator.ControllerCreator;
import org.olat.core.gui.control.generic.popup.PopupBrowserWindow;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
/** /**
...@@ -37,8 +39,11 @@ public class PdfDelivery implements Serializable { ...@@ -37,8 +39,11 @@ public class PdfDelivery implements Serializable {
private final String key; private final String key;
private String directory; private String directory;
private Identity identity; private Identity identity;
private ControllerCreator controllerCreator;
private Window window;
private WindowControl windowControl; private WindowControl windowControl;
private PopupBrowserWindow browserWindow;
private ControllerCreator controllerCreator;
public PdfDelivery(String key) { public PdfDelivery(String key) {
this.key = key; this.key = key;
...@@ -64,6 +69,14 @@ public class PdfDelivery implements Serializable { ...@@ -64,6 +69,14 @@ public class PdfDelivery implements Serializable {
this.identity = identity; this.identity = identity;
} }
public Window getWindow() {
return window;
}
public void setWindow(Window window) {
this.window = window;
}
public WindowControl getWindowControl() { public WindowControl getWindowControl() {
return windowControl; return windowControl;
} }
...@@ -80,6 +93,14 @@ public class PdfDelivery implements Serializable { ...@@ -80,6 +93,14 @@ public class PdfDelivery implements Serializable {
this.controllerCreator = controllerCreator; this.controllerCreator = controllerCreator;
} }
public PopupBrowserWindow getBrowserWindow() {
return browserWindow;
}
public void setBrowserWindow(PopupBrowserWindow browserWindow) {
this.browserWindow = browserWindow;
}
@Override @Override
public int hashCode() { public int hashCode() {
return key.hashCode(); return key.hashCode();
......
...@@ -286,9 +286,11 @@ public class QTI21AssessmentDetailsController extends FormBasicController { ...@@ -286,9 +286,11 @@ public class QTI21AssessmentDetailsController extends FormBasicController {
} }
infos.add(forgeDetailsRow(sessionStatistics)); infos.add(forgeDetailsRow(sessionStatistics));
} }
correctionCol.setAlwaysVisible(manualCorrections); if(correctionCol != null) {
correctionCol.setDefaultVisible(manualCorrections); correctionCol.setAlwaysVisible(manualCorrections);
tableEl.setColumnModelVisible(correctionCol, manualCorrections); correctionCol.setDefaultVisible(manualCorrections);
tableEl.setColumnModelVisible(correctionCol, manualCorrections);
}
Collections.sort(infos, new AssessmentTestSessionDetailsComparator()); Collections.sort(infos, new AssessmentTestSessionDetailsComparator());
tableModel.setObjects(infos); tableModel.setObjects(infos);
......
...@@ -180,6 +180,8 @@ public class ImageRunController extends BasicController implements PageRunElemen ...@@ -180,6 +180,8 @@ public class ImageRunController extends BasicController implements PageRunElemen
@Override @Override
protected void doDispose() { protected void doDispose() {
// if(imageCmp != null) {
imageCmp.dispose();
}
} }
} }
...@@ -72,7 +72,7 @@ public class PageController extends BasicController { ...@@ -72,7 +72,7 @@ public class PageController extends BasicController {
@Override @Override
protected void doDispose() { protected void doDispose() {
// fragmentsCmp.dispose();
} }
public boolean validateElements(UserRequest ureq, List<ValidationMessage> messages) { public boolean validateElements(UserRequest ureq, List<ValidationMessage> messages) {
......
...@@ -24,6 +24,7 @@ import java.util.List; ...@@ -24,6 +24,7 @@ import java.util.List;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component; import org.olat.core.gui.components.Component;
import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Disposable;
import org.olat.modules.ceditor.PageRunElement; import org.olat.modules.ceditor.PageRunElement;
import org.olat.modules.ceditor.ValidatingController; import org.olat.modules.ceditor.ValidatingController;
...@@ -33,13 +34,20 @@ import org.olat.modules.ceditor.ValidatingController; ...@@ -33,13 +34,20 @@ import org.olat.modules.ceditor.ValidatingController;
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
* *
*/ */
public class PageRunControllerElement implements PageRunElement { public class PageRunControllerElement implements PageRunElement, Disposable {
private Controller controller; private Controller controller;
public PageRunControllerElement(Controller controller) { public PageRunControllerElement(Controller controller) {
this.controller = controller; this.controller = controller;
} }
@Override
public void dispose() {
if(controller != null) {
controller.dispose();
}
}
@Override @Override
public Component getComponent() { public Component getComponent() {
......
...@@ -27,6 +27,7 @@ import org.olat.core.gui.components.AbstractComponent; ...@@ -27,6 +27,7 @@ import org.olat.core.gui.components.AbstractComponent;
import org.olat.core.gui.components.Component; import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.ComponentCollection; import org.olat.core.gui.components.ComponentCollection;
import org.olat.core.gui.components.ComponentRenderer; import org.olat.core.gui.components.ComponentRenderer;
import org.olat.core.gui.control.Disposable;
import org.olat.modules.ceditor.ui.ValidationMessage; import org.olat.modules.ceditor.ui.ValidationMessage;
import org.olat.modules.ceditor.ui.model.PageFragment; import org.olat.modules.ceditor.ui.model.PageFragment;
...@@ -36,7 +37,7 @@ import org.olat.modules.ceditor.ui.model.PageFragment; ...@@ -36,7 +37,7 @@ import org.olat.modules.ceditor.ui.model.PageFragment;
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
* *
*/ */
public class PageFragmentsComponent extends AbstractComponent implements ComponentCollection { public class PageFragmentsComponent extends AbstractComponent implements ComponentCollection, Disposable {
private static final PageFragmentsComponentRenderer RENDERER = new PageFragmentsComponentRenderer(); private static final PageFragmentsComponentRenderer RENDERER = new PageFragmentsComponentRenderer();
...@@ -79,6 +80,19 @@ public class PageFragmentsComponent extends AbstractComponent implements Compone ...@@ -79,6 +80,19 @@ public class PageFragmentsComponent extends AbstractComponent implements Compone
return components; return components;
} }
@Override
public void dispose() {
List<PageFragment> fragmentList = getFragments();
for(PageFragment fragment:fragmentList) {
if(fragment.getPageRunElement() instanceof Disposable) {
((Disposable)fragment.getPageRunElement()).dispose();
}
if(fragment.getPageElement() instanceof Disposable) {
((Disposable)fragment.getPageElement()).dispose();
}
}
}
public boolean validateElements(UserRequest ureq, List<ValidationMessage> messages) { public boolean validateElements(UserRequest ureq, List<ValidationMessage> messages) {
boolean allOk = true; boolean allOk = true;
List<PageFragment> fragmentList = getFragments(); List<PageFragment> fragmentList = getFragments();
......
...@@ -42,6 +42,8 @@ import org.olat.modules.portfolio.ui.MediaMetadataController; ...@@ -42,6 +42,8 @@ import org.olat.modules.portfolio.ui.MediaMetadataController;
*/ */
public class VideoMediaController extends BasicController { public class VideoMediaController extends BasicController {
private final ImageComponent videoCmp;
public VideoMediaController(UserRequest ureq, WindowControl wControl, Media media, MediaRenderingHints hints) { public VideoMediaController(UserRequest ureq, WindowControl wControl, Media media, MediaRenderingHints hints) {
super(ureq, wControl); super(ureq, wControl);
...@@ -49,7 +51,7 @@ public class VideoMediaController extends BasicController { ...@@ -49,7 +51,7 @@ public class VideoMediaController extends BasicController {
File mediaDir = new File(FolderConfig.getCanonicalRoot(), media.getStoragePath()); File mediaDir = new File(FolderConfig.getCanonicalRoot(), media.getStoragePath());
File mediaFile = new File(mediaDir, media.getRootFilename()); File mediaFile = new File(mediaDir, media.getRootFilename());
ImageComponent videoCmp = new ImageComponent(ureq.getUserSession(), "image"); videoCmp = new ImageComponent(ureq.getUserSession(), "image");
videoCmp.setMedia(mediaFile); videoCmp.setMedia(mediaFile);
mainVC.put("video", videoCmp); mainVC.put("video", videoCmp);
mainVC.contextPut("pdf", hints.isToPdf()); mainVC.contextPut("pdf", hints.isToPdf());
...@@ -77,6 +79,6 @@ public class VideoMediaController extends BasicController { ...@@ -77,6 +79,6 @@ public class VideoMediaController extends BasicController {
@Override @Override
protected void doDispose() { protected void doDispose() {
// videoCmp.dispose();
} }
} }
...@@ -241,15 +241,15 @@ class QualityReportAccessDAO { ...@@ -241,15 +241,15 @@ class QualityReportAccessDAO {
private List<Identity> loadRecipientsOfGroupRoles(QualityReportAccess reportAccess) { private List<Identity> loadRecipientsOfGroupRoles(QualityReportAccess reportAccess) {
QueryBuilder sb = new QueryBuilder(); QueryBuilder sb = new QueryBuilder();
sb.append("select membership.identity"); sb.append("select membership.identity");
sb.append(" from qualityreportaccess as ra"); sb.append(" from qualitycontext as context");
sb.append(" , qualitydatacollection as collection"); sb.append(" join context.dataCollection as collection");
sb.append(" , qualitycontext as context"); sb.append(" join qualityreportaccess as ra");
sb.append(" , repoentrytogroup as rel"); sb.append(" on ra.dataCollection.key = context.dataCollection.key");
sb.append(" , bgroupmember as membership"); sb.append(" join repoentrytogroup as rel");
sb.and().append("ra.dataCollection.key = context.dataCollection.key"); sb.append(" on rel.entry.key = context.audienceRepositoryEntry.key");
sb.and().append("rel.entry.key = context.audienceRepositoryEntry.key"); sb.append(" join bgroupmember as membership");
sb.and().append("rel.group.key = membership.group.key"); sb.append(" on membership.group.key = rel.group.key");
sb.and().append("membership.role = ra.role"); sb.append(" and membership.role = ra.role");
sb.and().append("ra.key = :reportAccessKey"); sb.and().append("ra.key = :reportAccessKey");
List<Identity> coureseMembers = dbInstance.getCurrentEntityManager() List<Identity> coureseMembers = dbInstance.getCurrentEntityManager()
...@@ -259,15 +259,15 @@ class QualityReportAccessDAO { ...@@ -259,15 +259,15 @@ class QualityReportAccessDAO {
QueryBuilder sbEle = new QueryBuilder(); QueryBuilder sbEle = new QueryBuilder();
sbEle.append("select membership.identity"); sbEle.append("select membership.identity");
sbEle.append(" from qualityreportaccess as ra"); sbEle.append(" from qualitycontext as context");
sbEle.append(" , qualitydatacollection as collection"); sbEle.append(" join context.dataCollection as collection");
sbEle.append(" , qualitycontext as context"); sbEle.append(" join qualityreportaccess as ra");
sbEle.append(" , curriculumelement as ele"); sbEle.append(" on ra.dataCollection.key = context.dataCollection.key");
sbEle.append(" , bgroupmember as membership"); sbEle.append(" join curriculumelement as ele");
sbEle.and().append("ra.dataCollection.key = context.dataCollection.key"); sbEle.append(" on ele.key = context.audienceCurriculumElement.key");
sbEle.and().append("ele.key = context.audienceCurriculumElement.key"); sbEle.append(" join bgroupmember as membership");
sbEle.and().append("ele.group.key = membership.group.key"); sbEle.append(" on membership.group.key = ele.group.key");
sbEle.and().append("membership.role = ra.role"); sbEle.append(" and membership.role = ra.role");
sbEle.and().append("ra.key = :reportAccessKey"); sbEle.and().append("ra.key = :reportAccessKey");
List<Identity> curriculumElementMembers = dbInstance.getCurrentEntityManager() List<Identity> curriculumElementMembers = dbInstance.getCurrentEntityManager()
...@@ -302,8 +302,8 @@ class QualityReportAccessDAO { ...@@ -302,8 +302,8 @@ class QualityReportAccessDAO {
QueryBuilder sb = new QueryBuilder(); QueryBuilder sb = new QueryBuilder();
sb.append("select membership.identity"); sb.append("select membership.identity");
sb.append(" from qualityreportaccess as ra"); sb.append(" from qualityreportaccess as ra");
sb.append(" , bgroupmember as membership"); sb.append(" join bgroupmember as membership");
sb.and().append("ra.group.key = membership.group.key"); sb.append(" on membership.group.key = ra.group.key");
sb.and().append("ra.key = :reportAccessKey"); sb.and().append("ra.key = :reportAccessKey");
return dbInstance.getCurrentEntityManager() return dbInstance.getCurrentEntityManager()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment