diff --git a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java index 081031a8aa7da7de3adb77caca01a569c6fe2e00..238b5876d3e5d7a25df5afc08d4e7611138fe299 100644 --- a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java +++ b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java @@ -25,21 +25,23 @@ package org.olat.admin.sysinfo; import org.olat.admin.AdminModule; -import org.olat.core.CoreSpringFactory; +import org.olat.admin.sysinfo.manager.CustomStaticFolderManager; import org.olat.core.commons.fullWebApp.util.GlobalStickyMessage; +import org.olat.core.commons.modules.bc.FolderRunController; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.panel.StackedPanel; -import org.olat.core.gui.components.panel.SimpleStackedPanel; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; +import org.olat.core.helpers.Settings; import org.olat.properties.Property; import org.olat.properties.PropertyManager; +import org.springframework.beans.factory.annotation.Autowired; /** * Description:<br> @@ -51,10 +53,18 @@ import org.olat.properties.PropertyManager; */ public class InfoMessageControllerSingleVM extends BasicController { - private Link infomsgEditButton,infomsgClearButton, maintenancemsgEditButton,maintenancemsgClearButton; - private VelocityContainer infoMsgView, infoMsgEdit; - private InfoMsgForm infoMsgForm, maintenanceMsgForm; - private StackedPanel container; + private final Link infomsgEditButton,infomsgClearButton, maintenancemsgEditButton, maintenancemsgClearButton; + private final VelocityContainer infoMsgView, infoMsgEdit; + private final InfoMsgForm infoMsgForm, maintenanceMsgForm; + private final FolderRunController staticFolderCtrl; + private final StackedPanel container; + + @Autowired + private PropertyManager pm; + @Autowired + private InfoMessageManager mrg; + @Autowired + private CustomStaticFolderManager staticFolderMgr; /** * @@ -63,12 +73,11 @@ public class InfoMessageControllerSingleVM extends BasicController { */ public InfoMessageControllerSingleVM(UserRequest ureq, WindowControl control) { super(ureq, control); - container = new SimpleStackedPanel("container"); infoMsgView = createVelocityContainer("infomsg"); infoMsgEdit = createVelocityContainer("infomsgEdit"); infoMsgView.contextPut("cluster", Boolean.FALSE); infoMsgEdit.contextPut("cluster", Boolean.FALSE); - PropertyManager pm = PropertyManager.getInstance(); + Property p = pm.findProperty(null, null, null, AdminModule.SYSTEM_PROPERTY_CATEGORY, AdminModule.PROPERTY_MAINTENANCE_MESSAGE); String adminToken = (p == null ? "" : p.getStringValue()); infoMsgView.contextPut("admintoken", adminToken); @@ -78,15 +87,13 @@ public class InfoMessageControllerSingleVM extends BasicController { maintenancemsgEditButton = LinkFactory.createButton("maintenancemsgEdit", infoMsgView, this); maintenancemsgClearButton = LinkFactory.createButton("maintenancemsgClear", infoMsgView, this); - //info message stuff - InfoMessageManager mrg = (InfoMessageManager)CoreSpringFactory.getBean(InfoMessageManager.class); + //login String infoMsg = mrg.getInfoMessage(); if (infoMsg != null && infoMsg.length() > 0) { infoMsgView.contextPut("infomsg", infoMsg); } infoMsgForm = new InfoMsgForm(ureq, control, infoMsg); listenTo(infoMsgForm); - infoMsgEdit.put("infoMsgForm", infoMsgForm.getInitialComponent()); //maintenance message stuff @@ -98,47 +105,48 @@ public class InfoMessageControllerSingleVM extends BasicController { listenTo(maintenanceMsgForm); infoMsgEdit.put("maintenanceMsgForm", maintenanceMsgForm.getInitialComponent()); - container.setContent(infoMsgView); + // /customizing/static/ + staticFolderCtrl = new FolderRunController(staticFolderMgr.getRootContainer(), true, ureq, control); + listenTo(staticFolderCtrl); + infoMsgEdit.put("staticFolder", staticFolderCtrl.getInitialComponent()); + + String url = Settings.getServerContextPathURI() + "/raw/static/"; + infoMsgEdit.contextPut("extlink", url); - putInitialPanel(container); + container = putInitialPanel(infoMsgView); } - + @Override + protected void doDispose() { + // + } - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ @Override protected void event(UserRequest ureq, Component source, Event event) { if (source == infomsgEditButton){ infoMsgEdit.contextPut("infoEdit", Boolean.TRUE); infoMsgEdit.contextPut("cluster", Boolean.FALSE); container.pushContent(infoMsgEdit); - } - else if (source == maintenancemsgEditButton){ + } else if (source == maintenancemsgEditButton){ infoMsgEdit.contextPut("infoEdit", Boolean.FALSE); infoMsgEdit.contextPut("cluster", Boolean.FALSE); container.pushContent(infoMsgEdit); - } - - // clear buttons - else if (source == maintenancemsgClearButton){ + } else if (source == maintenancemsgClearButton){ GlobalStickyMessage.setGlobalStickyMessage("", true); infoMsgView.contextRemove("maintenanceMsgAllNodes"); maintenanceMsgForm.reset(); - } - else if (source == infomsgClearButton){ - InfoMessageManager mrg = (InfoMessageManager)CoreSpringFactory.getBean(InfoMessageManager.class); + } else if (source == infomsgClearButton){ mrg.setInfoMessage(""); infoMsgView.contextRemove("infomsg"); infoMsgForm.reset(); } } + @Override protected void event(UserRequest ureq, Controller source, Event event) { - if (source == infoMsgForm && event == Event.DONE_EVENT) { + if (source == infoMsgForm) { + if(event == Event.DONE_EVENT) { String infoMsg = infoMsgForm.getInfoMsg(); - InfoMessageManager mrg = (InfoMessageManager)CoreSpringFactory.getBean(InfoMessageManager.class); mrg.setInfoMessage(infoMsg); if (infoMsg != null && infoMsg.length() > 0) { infoMsgView.contextPut("infomsg", infoMsg); @@ -146,8 +154,10 @@ public class InfoMessageControllerSingleVM extends BasicController { } else { infoMsgView.contextRemove("infomsg"); } - container.popContent(); - } else if (source == maintenanceMsgForm && event == Event.DONE_EVENT) { + } + container.popContent(); + } else if (source == maintenanceMsgForm) { + if(event == Event.DONE_EVENT) { String maintenanceMsg = maintenanceMsgForm.getInfoMsg(); GlobalStickyMessage.setGlobalStickyMessage(maintenanceMsg, true); if (maintenanceMsg != null && maintenanceMsg.length() > 0) { @@ -156,38 +166,24 @@ public class InfoMessageControllerSingleVM extends BasicController { } else { infoMsgView.contextRemove("maintenanceMsgAllNodes"); } - container.popContent(); - } - - if (event == Event.CANCELLED_EVENT && (source == infoMsgForm || source == maintenanceMsgForm)) { + } container.popContent(); } - } protected VelocityContainer getViewContainer() { return infoMsgView; } + protected VelocityContainer getEditContainer() { return infoMsgEdit; } + protected StackedPanel getMainContainer() { return container; } + protected InfoMsgForm getMaintenanceMsgForm() { return maintenanceMsgForm; } - - /** - * @see org.olat.core.gui.control.DefaultController#doDispose() - */ - @Override - protected void doDispose() { - // TODO Auto-generated method stub - - } - - - - -} +} \ No newline at end of file diff --git a/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java b/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java index ce12d1c3b73912b31e7713bf5a343f8b20c1c83b..3829cb30a9c0029066e3f7cb512c13a896891fc4 100644 --- a/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java +++ b/src/main/java/org/olat/admin/sysinfo/InfoMsgForm.java @@ -29,6 +29,7 @@ package org.olat.admin.sysinfo; +import org.olat.admin.sysinfo.manager.CustomStaticFolderManager; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.RichTextElement; @@ -38,6 +39,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.richText.RichTex import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; +import org.springframework.beans.factory.annotation.Autowired; /** * Initial Date: Apr 30, 2004 @@ -49,7 +51,10 @@ import org.olat.core.gui.control.WindowControl; public class InfoMsgForm extends FormBasicController { private RichTextElement msg; - private String infomsg; + private final String infomsg; + + @Autowired + private CustomStaticFolderManager staticFolderMgr; /** * @param name @@ -73,7 +78,6 @@ public class InfoMsgForm extends FormBasicController { msg.setValue(""); } - @Override protected void formOK(UserRequest ureq) { fireEvent(ureq, Event.DONE_EVENT); @@ -86,9 +90,9 @@ public class InfoMsgForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - msg = uifactory.addRichTextElementForStringData("msg", "infomsg", infomsg, 20, 70, true, null, null, formLayout, ureq.getUserSession(), getWindowControl()); + msg = uifactory.addRichTextElementForStringData("msg", "infomsg", infomsg, 20, 70, true, staticFolderMgr.getRootContainer(), null, formLayout, ureq.getUserSession(), getWindowControl()); msg.setMaxLength(1024); - + RichTextConfiguration richTextConfig = msg.getEditorConfiguration(); // manually enable the source edit button richTextConfig.enableCode(); @@ -98,6 +102,7 @@ public class InfoMsgForm extends FormBasicController { // add style buttons to make alert style available richTextConfig.setContentCSSFromTheme(getWindowControl().getWindowBackOffice().getWindow().getGuiTheme()); richTextConfig.enableStyleSelection(); + richTextConfig.setLinkBrowserAbsolutFilePath("/raw/static/"); FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonGroupLayout", getTranslator()); formLayout.add(buttonGroupLayout); @@ -109,5 +114,4 @@ public class InfoMsgForm extends FormBasicController { protected void doDispose() { // } - -} +} \ No newline at end of file diff --git a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html index 8a478f2ab40f9f2243e897874e58b56226b6729b..66cd49fdc280b5c791d07ee5221b67199c965dd0 100644 --- a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html +++ b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html @@ -1,4 +1,3 @@ - #if ($infoEdit) <h3>$r.translate("infomsgEdit")</h3> #if ($cluster) @@ -13,4 +12,8 @@ #else $r.render("maintenanceMsgForm") #end -#end \ No newline at end of file +#end + +<h3>$r.translate("staticFolder")</h3> +<div class="o_copy_code">$extlink</div> +$r.render("staticFolder") \ No newline at end of file diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties index 6d79e6de702ba621e393c1c01f272c9f31b022f9..29a4e5c6ed7fb661c70e068f193f1b19584473cb 100644 --- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties @@ -151,6 +151,7 @@ session.timeout.label=DMZ Session Timeout in Sekunden sessionadministration.title=Session Administration sessions=Sessions snoop=Snoop +staticFolder=Static Ordner sysinfo=Systeminformation sysinfo.basedir=Webapp Verzeichnis sysinfo.cluster=Cluster diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties index 9b152c90f87d4f5f9f4872c65c5870235f994ba8..a0edc35c75b248b314b35c4142fff4df3358beef 100644 --- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_en.properties @@ -151,6 +151,7 @@ session.timeout.label=DMZ session timeout in seconds sessionadministration.title=Session administration sessions=Sessions snoop=Snoop +staticFolder=Static folder sysinfo=System information sysinfo.basedir=Webapp directory sysinfo.cluster=Cluster diff --git a/src/main/java/org/olat/admin/sysinfo/manager/CustomStaticFolderManager.java b/src/main/java/org/olat/admin/sysinfo/manager/CustomStaticFolderManager.java new file mode 100644 index 0000000000000000000000000000000000000000..a751c329b965b31ba38159462bc257bd889bb856 --- /dev/null +++ b/src/main/java/org/olat/admin/sysinfo/manager/CustomStaticFolderManager.java @@ -0,0 +1,79 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.admin.sysinfo.manager; + +import java.io.File; + +import org.olat.core.commons.services.webdav.WebDAVProvider; +import org.olat.core.id.IdentityEnvironment; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.WebappHelper; +import org.olat.core.util.vfs.LocalFolderImpl; +import org.olat.core.util.vfs.VFSContainer; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 22.01.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class CustomStaticFolderManager implements InitializingBean, WebDAVProvider { + + private static final OLog log = Tracing.createLoggerFor(CustomStaticFolderManager.class); + public static final String STATIC_FOLDER = "/customizing/static/"; + + private static final String MOUNT_POINT = "customizing"; + + @Override + public void afterPropertiesSet() throws Exception { + File file = new File(WebappHelper.getUserDataRoot(), STATIC_FOLDER); + if(!file.exists()) { + if(!file.mkdirs()) { + log.error("/customizing/static/ folder cannot be created"); + } + } + } + + public VFSContainer getRootContainer() { + File file = new File(WebappHelper.getUserDataRoot(), STATIC_FOLDER); + return new LocalFolderImpl(file); + } + + public File getRootFile() { + return new File(WebappHelper.getUserDataRoot(), STATIC_FOLDER); + } + + @Override + public String getMountPoint() { + return MOUNT_POINT; + } + + @Override + public VFSContainer getContainer(IdentityEnvironment identityEnv) { + if(identityEnv != null && identityEnv.getRoles() != null && identityEnv.getRoles().isOLATAdmin()) { + return getRootContainer(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java index e957eb2544b8facf99f6a43a3a10df3a8e674cbc..0ae0ba7dfe3d9d757d9f1cdba87ca6df878f4ad2 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java @@ -45,6 +45,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.util.FileUtils; +import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; import org.olat.core.util.vfs.Quota; import org.olat.core.util.vfs.VFSContainer; @@ -77,6 +78,7 @@ public class FileLinkChooserController extends BasicController { private final String fileName; private String[] suffixes; + private final String absolutePath; private VFSContainer rootDir; @Autowired private MovieService movieService; @@ -93,11 +95,12 @@ public class FileLinkChooserController extends BasicController { * index.html */ public FileLinkChooserController(UserRequest ureq, WindowControl wControl, - VFSContainer rootDir, String uploadRelPath, String[] suffixes, String fileName) { + VFSContainer rootDir, String uploadRelPath, String absolutePath, String[] suffixes, String fileName) { super(ureq, wControl); this.fileName = fileName; this.suffixes = suffixes; this.rootDir = rootDir; + this.absolutePath = absolutePath; this.mainVC = createVelocityContainer("filechooser"); // file uploads are relative to the currently edited file @@ -174,19 +177,12 @@ public class FileLinkChooserController extends BasicController { putInitialPanel(mainVC); } - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, - * org.olat.core.gui.control.Event) - */ + @Override public void event(UserRequest ureq, Component source, Event event) { // no events to catch } - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) - */ + @Override public void event(UserRequest ureq, Controller source, Event event) { if (source == uploadCtr) { if (event instanceof FolderEvent) { @@ -197,10 +193,16 @@ public class FileLinkChooserController extends BasicController { if(item != null) { size = getSize(item, item.getName()); } + + String relPath = folderEvent.getFilename(); + if(StringHelper.containsNonWhitespace(absolutePath)) { + relPath = absolutePath + relPath; + } + if(size != null) { - fireEvent(ureq, new URLChoosenEvent(folderEvent.getFilename(), null, null, null, size.getWidth(), size.getHeight())); + fireEvent(ureq, new URLChoosenEvent(relPath, null, null, null, size.getWidth(), size.getHeight())); } else { - fireEvent(ureq, new URLChoosenEvent(folderEvent.getFilename())); + fireEvent(ureq, new URLChoosenEvent(relPath)); } } else { setErrorMessage(folderEvent.getFilename()); @@ -224,6 +226,9 @@ public class FileLinkChooserController extends BasicController { String relPath = FileChooserUIFactory .getSelectedRelativeItemPath(fileEvent, rootDir, fileName); // notify parent controller + if(StringHelper.containsNonWhitespace(absolutePath)) { + relPath = absolutePath + relPath; + } if(size != null) { fireEvent(ureq, new URLChoosenEvent(relPath, null, null, null, size.getWidth(), size.getHeight())); @@ -249,13 +254,13 @@ public class FileLinkChooserController extends BasicController { return size; } - private boolean isFileSuffixOk(String fileName) { + private boolean isFileSuffixOk(String filename) { if (suffixes == null) { // no defined suffixes => all allowed return true; } else { // check if siffix one of allowed suffixes - String suffix = getSuffix(fileName); + String suffix = getSuffix(filename); for (String allowedSuffix : suffixes) { if (allowedSuffix.equals(suffix)) { return true; @@ -280,13 +285,14 @@ public class FileLinkChooserController extends BasicController { allowedSuffixes.toString() })); } - private String getSuffix(String fileName) { - return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); + private String getSuffix(String filename) { + return filename.substring(filename.lastIndexOf(".") + 1).toLowerCase(); } /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) */ + @Override protected void doDispose() { // controllers autodisposed by basic controller } diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java index 68b12f523b5e2e4b6bd70627f8aef0cbb8b174ac..163555ff388581504810c164e9a5c4760f80e806 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java @@ -69,7 +69,8 @@ public class LinkChooserController extends BasicController { * tree model. The internal-link chooser tab won't be shown when the * internalLinkTreeModel is null. */ - public LinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath, String[] suffixes, String fileName, + public LinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, + String uploadRelPath, String absolutPath, String[] suffixes, String fileName, CustomLinkTreeModel customLinkTreeModel) { super(ureq, wControl); @@ -78,7 +79,7 @@ public class LinkChooserController extends BasicController { linkChooserTabbedPane = new TabbedPane("linkChooserTabbedPane", ureq.getLocale()); tabbedPaneViewVC.put("linkChooserTabbedPane", linkChooserTabbedPane); - fileLinkChooserController = new FileLinkChooserController(ureq, wControl, rootDir, uploadRelPath, suffixes, fileName); + fileLinkChooserController = new FileLinkChooserController(ureq, wControl, rootDir, uploadRelPath, absolutPath, suffixes, fileName); listenTo(fileLinkChooserController); linkChooserTabbedPane.addTab(translate("linkchooser.tabbedpane.label.filechooser"), fileLinkChooserController.getInitialComponent()); diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java index 2ded6153438ea0360ef21c7a47197e9df8e63d68..9953249ffb57966c843f401257d3d2d9d3ce7687 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/MediaChooserController.java @@ -64,7 +64,7 @@ public class MediaChooserController extends LinkChooserController { */ public MediaChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath, String[] suffixes, String fileName, CustomLinkTreeModel customLinkTreeModel) { - super(ureq, wControl, rootDir, uploadRelPath, suffixes, fileName, customLinkTreeModel); + super(ureq, wControl, rootDir, uploadRelPath, null, suffixes, fileName, customLinkTreeModel); } /** diff --git a/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java b/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java index 1a277b66eb5b575cf947ce0f30ce69a58529c9fc..325776f5866f8f81dfb7c5b787fadfd5fe9967fb 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java +++ b/src/main/java/org/olat/core/commons/modules/bc/FileCopyController.java @@ -87,7 +87,7 @@ public class FileCopyController extends LinkChooserController { public FileCopyController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, FolderComponent folderComponent) { - super(ureq, wControl, rootDir, null, null, "", null); + super(ureq, wControl, rootDir, null, null, null, "", null); this.folderComponent = folderComponent; vfsLockManager = CoreSpringFactory.getImpl(VFSLockManager.class); } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java index 2470e4e4af04d03915e908dda23f24d2bc71d7e5..647847f6321cda968274c6f4784d6a896a717724 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java @@ -139,6 +139,7 @@ public class RichTextConfiguration implements Disposable { private VFSContainer linkBrowserBaseContainer; private String linkBrowserUploadRelPath; private String linkBrowserRelativeFilePath; + private String linkBrowserAbsolutFilePath; private CustomLinkTreeModel linkBrowserCustomTreeModel; // DOM ID of the flexi form element private String domID; @@ -698,6 +699,14 @@ public class RichTextConfiguration implements Disposable { return linkBrowserRelativeFilePath; } + public String getLinkBrowserAbsolutFilePath() { + return linkBrowserAbsolutFilePath; + } + + public void setLinkBrowserAbsolutFilePath(String linkBrowserAbsolutFilePath) { + this.linkBrowserAbsolutFilePath = linkBrowserAbsolutFilePath; + } + /** * Get the optional custom link browser tree model * @return the model or NULL if not defined diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java index 03ea1913f3626b12694de2c6665a31c89e9efe28..e119913df7b2d60e041660b12f311822ad018de9 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementComponent.java @@ -23,7 +23,6 @@ package org.olat.core.gui.components.form.flexible.impl.elements.richText; import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel; import org.olat.core.commons.controllers.linkchooser.LinkChooserController; import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; -import org.olat.core.dispatcher.impl.StaticMediaDispatcher; import org.olat.core.gui.UserRequest; import org.olat.core.gui.Windows; import org.olat.core.gui.components.ComponentRenderer; @@ -33,9 +32,7 @@ import org.olat.core.gui.control.JSAndCSSAdder; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.creator.ControllerCreator; import org.olat.core.gui.control.generic.popup.PopupBrowserWindow; -import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.ValidationResult; -import org.olat.core.helpers.Settings; import org.olat.core.util.vfs.VFSContainer; /** @@ -54,13 +51,11 @@ class RichTextElementComponent extends FormBaseComponentImpl { private static final String CMD_IMAGEBROWSER = "image"; private static final String CMD_FLASHPLAYERBROWSER = "flashplayer"; private static final String CMD_FILEBROWSER = "file"; + private static final ComponentRenderer RENDERER = new RichTextElementRenderer(); - private ComponentRenderer RENDERER = new RichTextElementRenderer(); - private RichTextElementImpl element; + private final RichTextElementImpl element; private int cols; private int rows; - - private boolean useTiny4 = true; /** * Constructor for a text area element @@ -108,54 +103,13 @@ class RichTextElementComponent extends FormBaseComponentImpl { this.rows = rows; } - public boolean isUseTiny4() { - return useTiny4; - } - - /** - * @see org.olat.core.gui.components.Component#validate(org.olat.core.gui.UserRequest, - * org.olat.core.gui.render.ValidationResult) - */ @Override public void validate(UserRequest ureq, ValidationResult vr) { super.validate(ureq, vr); JSAndCSSAdder jsa = vr.getJsAndCSSAdder(); - - if(useTiny4) { - jsa.addRequiredStaticJsFile("js/tinymce4/BTinyHelper.js"); - } else { - // Add tiny helper library - //jsa.addRequiredJsFile(RichTextElementComponent.class,"js/BTinyHelper.js", "UTF-8"); - jsa.addRequiredStaticJsFile("js/tinymce/BTinyHelper.js"); - - // When the tiny_mce.js is inserted via AJAX, we need to setup some - // variables first to make it load properly: - StringOutput sb = new StringOutput(); - // 1) Use tinyMCEPreInit to prevent TinyMCE to guess the script URL. The - // script URL is needed because TinyMCE will load CSS, plugins and other - // resources - sb.append("tinyMCEPreInit = {};") - .append("tinyMCEPreInit.suffix = '';") - .append("tinyMCEPreInit.base = '"); - StaticMediaDispatcher.renderStaticURI(sb, "js/tinymce/tinymce", false); - sb.append("';"); - - // 2) Tell TinyMCE that the page has already been loaded - sb.append("tinyMCE_GZ = {};"); - sb.append("tinyMCE_GZ.loaded = true;"); - String preAJAXinsertionCode = sb.toString(); - - // Now add tiny library itself. TinyMCE files are written in iso-8859-1 - // (important, IE panics otherwise with error 8002010) - if (Settings.isDebuging()) { - jsa.addRequiredStaticJsFile("js/tinymce/tinymce/tiny_mce_src.js", "ISO-8859-1",preAJAXinsertionCode); - } else { - jsa.addRequiredStaticJsFile("js/tinymce/tinymce/tiny_mce.js", "ISO-8859-1", preAJAXinsertionCode); - } - } + jsa.addRequiredStaticJsFile("js/tinymce4/BTinyHelper.js"); } - @Override protected void doDispatchRequest(UserRequest ureq) { // SPECIAL CASE - normally this method is never overriden. For the rich text @@ -170,7 +124,6 @@ class RichTextElementComponent extends FormBaseComponentImpl { setDirty(false); } - private void createFileSelectorPopupWindow(final UserRequest ureq, final String type, final String fileName) { // Get allowed suffixes from configuration and requested media browser type from event final RichTextConfiguration config = element.getEditorConfiguration(); @@ -195,14 +148,15 @@ class RichTextElementComponent extends FormBaseComponentImpl { LinkChooserController myLinkChooserController; VFSContainer baseContainer = config.getLinkBrowserBaseContainer(); String uploadRelPath = config.getLinkBrowserUploadRelPath(); + String absolutePath = config.getLinkBrowserAbsolutFilePath(); CustomLinkTreeModel linkBrowserCustomTreeModel = config.getLinkBrowserCustomLinkTreeModel(); if (type.equals(CMD_FILEBROWSER)) { // when in file mode we include the internal links to the selection //FIXME: user activity logger - myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, suffixes, fileName, linkBrowserCustomTreeModel); + myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, fileName, linkBrowserCustomTreeModel); } else { // in media or image mode, internal links make no sense here - myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, suffixes, fileName, null); + myLinkChooserController = new LinkChooserController(lureq, lwControl, baseContainer, uploadRelPath, absolutePath, suffixes, fileName, null); } return new LayoutMain3ColsController(lureq, lwControl, myLinkChooserController); } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java index 6fff98f2ef5a0540198b843960660e4f34f54513..abadef55ba81091d09e4606718f965c5cf416e46 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextElementRenderer.java @@ -25,11 +25,10 @@ import java.util.List; import org.apache.commons.lang.StringEscapeUtils; import org.olat.core.dispatcher.impl.StaticMediaDispatcher; import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.ComponentRenderer; +import org.olat.core.gui.components.DefaultComponentRenderer; import org.olat.core.gui.components.form.flexible.impl.FormJSHelper; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; -import org.olat.core.gui.render.RenderingState; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; @@ -46,7 +45,7 @@ import org.olat.core.util.Formatter; * * @author gnaegi */ -class RichTextElementRenderer implements ComponentRenderer { +class RichTextElementRenderer extends DefaultComponentRenderer { /** * @see org.olat.core.gui.components.ComponentRenderer#render(org.olat.core.gui.render.Renderer, @@ -85,7 +84,7 @@ class RichTextElementRenderer implements ComponentRenderer { sb.append("\" >"); sb.append(Formatter.formatLatexFormulas(value)); sb.append("</div>"); - } else if(teC.isUseTiny4()) { + } else { renderTinyMCE_4(sb, domID, teC, ubu, source.getTranslator()); } } @@ -165,32 +164,4 @@ class RichTextElementRenderer implements ComponentRenderer { sb.append(StringEscapeUtils.escapeHtml(value)); sb.append("</textarea>"); } - - /** - * @see org.olat.core.gui.components.ComponentRenderer#renderBodyOnLoadJSFunctionCall(org.olat.core.gui.render.Renderer, - * org.olat.core.gui.render.StringOutput, - * org.olat.core.gui.components.Component, - * org.olat.core.gui.render.RenderingState) - */ - @Override - public void renderBodyOnLoadJSFunctionCall(Renderer renderer, - StringOutput sb, Component source, RenderingState rstate) { - // nothing to load - } - - /** - * @see org.olat.core.gui.components.ComponentRenderer#renderHeaderIncludes(org.olat.core.gui.render.Renderer, - * org.olat.core.gui.render.StringOutput, - * org.olat.core.gui.components.Component, - * org.olat.core.gui.render.URLBuilder, - * org.olat.core.gui.translator.Translator, - * org.olat.core.gui.render.RenderingState) - */ - @Override - public void renderHeaderIncludes(Renderer renderer, StringOutput sb, - Component source, URLBuilder ubu, Translator translator, - RenderingState rstate) { - // no headers to include - } - } diff --git a/src/main/java/org/olat/core/servlets/StaticServlet.java b/src/main/java/org/olat/core/servlets/StaticServlet.java index 8126618cfe63b8e003d970b4aebd9bdda19d4feb..4b72e70d8e2ecc2a6d395bd4fb2f06b4d4e65a22 100644 --- a/src/main/java/org/olat/core/servlets/StaticServlet.java +++ b/src/main/java/org/olat/core/servlets/StaticServlet.java @@ -27,6 +27,8 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.olat.admin.sysinfo.manager.CustomStaticFolderManager; +import org.olat.core.CoreSpringFactory; import org.olat.core.gui.media.FileMediaResource; import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.media.ServletUtil; @@ -81,6 +83,18 @@ public class StaticServlet extends HttpServlet { if (pathInfo.indexOf(NOVERSION) != -1) { // no version provided - only remove mapper staticRelPath = pathInfo.substring(NOVERSION.length() + 1, pathInfo.length()); + } else if (pathInfo.startsWith(STATIC_DIR_NAME)) { + staticRelPath = pathInfo.substring(STATIC_DIR_NAME.length() + 1, pathInfo.length()); + //customizing + CustomStaticFolderManager folderManager = CoreSpringFactory.getImpl(CustomStaticFolderManager.class); + File file = new File(folderManager.getRootFile(), staticRelPath); + if(file.exists()) { + MediaResource resource = new FileMediaResource(file); + ServletUtil.serveResource(request, response, resource); + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } + return; } else { // version provided - remove it String version; diff --git a/src/main/java/org/olat/modules/dialog/DialogElementsController.java b/src/main/java/org/olat/modules/dialog/DialogElementsController.java index 1b620ad6f7a24a1f7fea886c35699a4b4acfea50..51e1b3a8dda4eedb7197972c06187b0183dfcec2 100644 --- a/src/main/java/org/olat/modules/dialog/DialogElementsController.java +++ b/src/main/java/org/olat/modules/dialog/DialogElementsController.java @@ -463,7 +463,7 @@ public class DialogElementsController extends BasicController { private class MyLinkChooserController extends LinkChooserController { public MyLinkChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, String uploadRelPath) { - super(ureq, wControl, rootDir, uploadRelPath, null, "", null); + super(ureq, wControl, rootDir, uploadRelPath, null, null, "", null); } @Override diff --git a/src/main/webapp/static/movie/player.js b/src/main/webapp/static/movie/player.js index a75ccd661487acb727f37c3545a407490ac068b2..c24830e308c7a2d037892cc4ec72083a3da0a703 100644 --- a/src/main/webapp/static/movie/player.js +++ b/src/main/webapp/static/movie/player.js @@ -25,7 +25,7 @@ var BPlayer = { insertHTML5Player : function (address, domId, width, height, start, duration, provider, streamer, autostart, repeat, controlbar, poster) { var videoUrl = address - if(address.indexOf('://') < 0 && (address.indexOf('/secstatic/qtieditor/') >= 0 || address.indexOf('/secstatic/qti/') >= 0)) { + if(address.indexOf('://') < 0 && (address.indexOf('/raw/static/') == 0 || address.indexOf('/secstatic/qtieditor/') >= 0 || address.indexOf('/secstatic/qti/') >= 0)) { videoUrl = address; } else if(address.indexOf('://') < 0 && ((provider != "rtmp" && provider != "http") || ((provider == "rtmp" || provider == "http") && (streamer == undefined || streamer.length == 0)))) {