diff --git a/src/main/java/de/bps/course/nodes/ll/LLRunController.java b/src/main/java/de/bps/course/nodes/ll/LLRunController.java index 3d6bb868ae04abd4de56fd2383bd4c60414aaf7e..98e586cb92d845f0e2cc13ba8478d1bf934c387f 100644 --- a/src/main/java/de/bps/course/nodes/ll/LLRunController.java +++ b/src/main/java/de/bps/course/nodes/ll/LLRunController.java @@ -24,7 +24,7 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import org.olat.core.CoreSpringFactory; -import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserController; +import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserFactory; import org.olat.core.dispatcher.mapper.Mapper; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; @@ -56,30 +56,28 @@ import de.bps.course.nodes.LLCourseNode; */ public class LLRunController extends BasicController { - private VelocityContainer runVC; - public LLRunController(UserRequest ureq, WindowControl wControl, ModuleConfiguration moduleConfig, LLCourseNode llCourseNode, UserCourseEnvironment userCourseEnv, boolean showLinkComments) { super(ureq, wControl); - this.runVC = this.createVelocityContainer("run"); - final List<LLModel> linkList = (List<LLModel>) moduleConfig.get(LLCourseNode.CONF_LINKLIST); - this.runVC.contextPut("linkList", linkList); - this.runVC.contextPut("showLinkComments", Boolean.valueOf(showLinkComments)); + VelocityContainer runVC = createVelocityContainer("run"); + @SuppressWarnings("unchecked") + final List<LLModel> linkList = (List<LLModel>) moduleConfig.get(LLCourseNode.CONF_LINKLIST); + runVC.contextPut("linkList", linkList); + runVC.contextPut("showLinkComments", Boolean.valueOf(showLinkComments)); CourseEnvironment courseEnv = userCourseEnv.getCourseEnvironment(); VFSContainer courseContainer = courseEnv.getCourseFolderContainer(); Mapper customMapper = null; - if (CoreSpringFactory.containsBean(CustomMediaChooserController.class.getName())) { - CustomMediaChooserController customMediaChooserFactory = (CustomMediaChooserController) CoreSpringFactory.getBean(CustomMediaChooserController.class.getName()); - customMapper = customMediaChooserFactory.getMapperInstance(courseContainer, null, null); + if (CoreSpringFactory.containsBean(CustomMediaChooserFactory.class.getName())) { + CustomMediaChooserFactory customMediaChooserFactory = (CustomMediaChooserFactory)CoreSpringFactory.getBean(CustomMediaChooserFactory.class.getName()); + customMapper = customMediaChooserFactory.getMapperInstance(); } String mapperID = courseEnv.getCourseResourceableId() + "/" + llCourseNode.getIdent(); String mapperBaseUrl = registerCacheableMapper(ureq, mapperID, new LLMapper(linkList, customMapper, courseContainer)); runVC.contextPut("mapperBaseUrl", mapperBaseUrl); - putInitialPanel(runVC); } diff --git a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java b/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java index 899c2d3a6911e3601e9c0819d9bdef9bf05459a8..d2b9fe88b7bbdaa33a47c7a5244a6306ea34647c 100644 --- a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java +++ b/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java @@ -37,6 +37,7 @@ import org.olat.commons.calendar.model.KalendarEventLink; import org.olat.commons.calendar.ui.components.KalendarRenderWrapper; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserController; +import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserFactory; import org.olat.core.commons.controllers.linkchooser.URLChoosenEvent; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; @@ -109,12 +110,12 @@ public class KalendarEntryDetailsController extends BasicController { pane.addTab(translate("tab.links"), linkVC); //custom media chooser - if (CoreSpringFactory.containsBean(CustomMediaChooserController.class.getName())) { - CustomMediaChooserController customMediaChooserFactory = (CustomMediaChooserController) CoreSpringFactory.getBean(CustomMediaChooserController.class.getName()); - customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl, null, null, null); + if (CoreSpringFactory.containsBean(CustomMediaChooserFactory.class.getName())) { + CustomMediaChooserFactory customMediaChooserFactory = (CustomMediaChooserFactory) CoreSpringFactory.getBean(CustomMediaChooserFactory.class.getName()); + customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl); if (customMediaChooserCtr != null) { listenTo(customMediaChooserCtr); - mediaLinksController = new MediaLinksController(ureq, wControl, kalendarEvent, customMediaChooserCtr); + mediaLinksController = new MediaLinksController(ureq, wControl, kalendarEvent, customMediaChooserFactory); pane.addTab(customMediaChooserCtr.getTabbedPaneTitle(), mediaLinksController.getInitialComponent()); listenTo(mediaLinksController); } diff --git a/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java b/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java index d951ff3b21fd858dfe9aedea672fea8b1b1d9bd8..0f137e22cac2d1fa55c30e397af28e158bb79079 100644 --- a/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java +++ b/src/main/java/org/olat/commons/calendar/ui/MediaLinksController.java @@ -31,9 +31,9 @@ import org.olat.commons.calendar.CalendarManager; import org.olat.commons.calendar.model.KalendarEvent; import org.olat.commons.calendar.model.KalendarEventLink; import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserController; +import org.olat.core.commons.controllers.linkchooser.CustomMediaChooserFactory; import org.olat.core.commons.controllers.linkchooser.URLChoosenEvent; import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FormLink; @@ -76,16 +76,16 @@ public class MediaLinksController extends FormBasicController { private FormLayoutContainer linksContainer; private CloseableModalController mediaDialogBox; private CustomMediaChooserController mediaChooserController; - private CustomMediaChooserController customMediaChooserController; public MediaLinksController(UserRequest ureq, WindowControl wControl, KalendarEvent kalendarEvent, - CustomMediaChooserController customMediaChooserController) { + CustomMediaChooserFactory customMediaChooserFactory) { super(ureq, wControl, LAYOUT_VERTICAL); setBasePackage(CalendarManager.class); this.kalendarEvent = kalendarEvent; - this.customMediaChooserController = customMediaChooserController; - this.provider = customMediaChooserController.getClass().getSimpleName(); + mediaChooserController = customMediaChooserFactory.getInstance(ureq, wControl); + listenTo(mediaChooserController); + this.provider = mediaChooserController.getClass().getSimpleName(); externalLinks = new ArrayList<LinkWrapper>(); List<KalendarEventLink> links = kalendarEvent.getKalendarEventLinks(); @@ -204,11 +204,7 @@ public class MediaLinksController extends FormBasicController { } } else if (currentLink.getMediaButton().equals(source)) { removeAsListenerAndDispose(mediaDialogBox); - removeAsListenerAndDispose(mediaChooserController); - - mediaChooserController = customMediaChooserController.getInstance(ureq, getWindowControl(), null, null, ""); - listenTo(mediaChooserController); - + mediaDialogBox = new CloseableModalController(getWindowControl(), translate("choose"), mediaChooserController.getInitialComponent()); mediaDialogBox.activate(); listenTo(mediaDialogBox); @@ -216,18 +212,12 @@ public class MediaLinksController extends FormBasicController { } } - @Override - public void event(UserRequest ureq, Component source, Event event) { - super.event(ureq, source, event); - } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(source == mediaDialogBox) { removeAsListenerAndDispose(mediaDialogBox); - removeAsListenerAndDispose(mediaChooserController); mediaDialogBox = null; - mediaChooserController = null; } else if(mediaChooserController == source) { if(event instanceof URLChoosenEvent) { URLChoosenEvent choosenEvent = (URLChoosenEvent)event; @@ -240,9 +230,7 @@ public class MediaLinksController extends FormBasicController { } mediaDialogBox.deactivate(); removeAsListenerAndDispose(mediaDialogBox); - removeAsListenerAndDispose(mediaChooserController); mediaDialogBox = null; - mediaChooserController = null; } super.event(ureq, source, event); } @@ -283,7 +271,7 @@ public class MediaLinksController extends FormBasicController { //remove deleted links for(Iterator<KalendarEventLink> it=links.iterator(); it.hasNext(); ) { KalendarEventLink link = it.next(); - if(provider.equals(link.getId()) && !usedUuids.contains(link.getId())) { + if(provider.equals(link.getProvider()) && !usedUuids.contains(link.getId())) { it.remove(); } } diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java index fca3fb63d79dc80db77f377178a6e3b4ebc67a64..5ce480e449d2664aeb115e0e9c076a0a5a8b031c 100644 --- a/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserController.java @@ -34,11 +34,8 @@ package org.olat.core.commons.controllers.linkchooser; * * @author Florian Gnägi, frentix GmbH, http://www.frentix.com */ -import org.olat.core.dispatcher.mapper.Mapper; -import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.DefaultController; import org.olat.core.gui.control.WindowControl; -import org.olat.core.util.vfs.VFSContainer; public abstract class CustomMediaChooserController extends DefaultController { @@ -51,28 +48,8 @@ public abstract class CustomMediaChooserController extends DefaultController { super(wControl); } - /** - * Factory method to create a custom media chooser controller from a (Spring) - * instance - * - * @param ureq - * @param wControl - * @param rootDir - * @param suffixes - * @param fileName - * @param userActivityLogger - * @return true if success, false if no success, e.g. because user has no - * access right to start this controller - */ - abstract public CustomMediaChooserController getInstance(UserRequest ureq, WindowControl wControl, VFSContainer rootDir, - String[] suffixes, String fileName); - - //fxdiff - abstract public Mapper getMapperInstance(VFSContainer rootDir, String[] suffixes, String fileName); - /** * @return Title for media chooser tabbed pane */ - abstract public String getTabbedPaneTitle(); - + public abstract String getTabbedPaneTitle(); } diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserFactory.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..c6725eaffbc5d9fa22d8afc927699c06e2f51919 --- /dev/null +++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/CustomMediaChooserFactory.java @@ -0,0 +1,38 @@ +/** + * <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.core.commons.controllers.linkchooser; + +import org.olat.core.dispatcher.mapper.Mapper; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.control.WindowControl; + +/** + * + * Initial date: 04.12.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface CustomMediaChooserFactory { + + public Mapper getMapperInstance(); + + public CustomMediaChooserController getInstance(UserRequest ureq, WindowControl wControl); + +} 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 59f8706173064d1ceb2ae722fe51a290e134b753..68b12f523b5e2e4b6bd70627f8aef0cbb8b174ac 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 @@ -90,9 +90,9 @@ public class LinkChooserController extends BasicController { // try to add custom media chooser from spring configuration. // This one will be added as additional tab. - if (CoreSpringFactory.containsBean(CustomMediaChooserController.class.getName())) { - CustomMediaChooserController customMediaChooserFactory = (CustomMediaChooserController) CoreSpringFactory.getBean(CustomMediaChooserController.class.getName()); - customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl, rootDir, suffixes, fileName); + if (CoreSpringFactory.containsBean(CustomMediaChooserFactory.class.getName())) { + CustomMediaChooserFactory customMediaChooserFactory = (CustomMediaChooserFactory) CoreSpringFactory.getBean(CustomMediaChooserFactory.class.getName()); + customMediaChooserCtr = customMediaChooserFactory.getInstance(ureq, wControl); if (customMediaChooserCtr != null) { listenTo(customMediaChooserCtr); linkChooserTabbedPane.addTab(customMediaChooserCtr.getTabbedPaneTitle(), customMediaChooserCtr.getInitialComponent()); diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java index a4529e5b0b42d83b4e3e2d0917b63646e2a04943..7c904ddd6006453f50d82b75a2c01966d1adbc11 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java +++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdServeResource.java @@ -88,43 +88,47 @@ public class CmdServeResource implements FolderCommand { // set the http content-type and the encoding // try to load in iso-8859-1 InputStream is = vfsfile.getInputStream(); - String page = FileUtils.load(is, DEFAULT_ENCODING); - // search for the <meta content="text/html; charset=utf-8" - // http-equiv="Content-Type" /> tag - // if none found, assume iso-8859-1 - String enc = DEFAULT_ENCODING; - boolean useLoaded = false; - // <meta.*charset=([^"]*)" - Matcher m = PATTERN_ENCTYPE.matcher(page); - boolean found = m.find(); - if (found) { - String htmlcharset = m.group(1); - enc = htmlcharset; - if (htmlcharset.equals(DEFAULT_ENCODING)) { + if(is == null) { + mr = new NotFoundMediaResource(path); + } else { + String page = FileUtils.load(is, DEFAULT_ENCODING); + // search for the <meta content="text/html; charset=utf-8" + // http-equiv="Content-Type" /> tag + // if none found, assume iso-8859-1 + String enc = DEFAULT_ENCODING; + boolean useLoaded = false; + // <meta.*charset=([^"]*)" + Matcher m = PATTERN_ENCTYPE.matcher(page); + boolean found = m.find(); + if (found) { + String htmlcharset = m.group(1); + enc = htmlcharset; + if (htmlcharset.equals(DEFAULT_ENCODING)) { + useLoaded = true; + } + } else { useLoaded = true; } - } else { - useLoaded = true; - } - // set the new encoding to remember for any following .js file loads - g_encoding = enc; - if (useLoaded) { - StringMediaResource smr = new StringMediaResource(); - String mimetype = forceDownload ? VFSMediaResource.MIME_TYPE_FORCE_DOWNLOAD : "text/html;charset=" + enc; - smr.setContentType(mimetype); - smr.setEncoding(enc); - smr.setData(page); - mr = smr; - } else { - // found a new charset other than iso-8859-1 -> let it load again - // as bytes (so we do not need to convert to string and back - // again) - VFSMediaResource vmr = new VFSMediaResource(vfsfile); - vmr.setEncoding(enc); - if(forceDownload) { - vmr.setDownloadable(true); + // set the new encoding to remember for any following .js file loads + g_encoding = enc; + if (useLoaded) { + StringMediaResource smr = new StringMediaResource(); + String mimetype = forceDownload ? VFSMediaResource.MIME_TYPE_FORCE_DOWNLOAD : "text/html;charset=" + enc; + smr.setContentType(mimetype); + smr.setEncoding(enc); + smr.setData(page); + mr = smr; + } else { + // found a new charset other than iso-8859-1 -> let it load again + // as bytes (so we do not need to convert to string and back + // again) + VFSMediaResource vmr = new VFSMediaResource(vfsfile); + vmr.setEncoding(enc); + if(forceDownload) { + vmr.setDownloadable(true); + } + mr = vmr; } - mr = vmr; } } else if (path.endsWith(".js")) { // a javascript library VFSMediaResource vmr = new VFSMediaResource(vfsfile); diff --git a/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java b/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java index 8db7ad2b282594d362239e595b28ce0bb61587e0..ec48aad3c800344a0f2cd06add668c28466a385e 100644 --- a/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java +++ b/src/main/java/org/olat/core/util/vfs/LocalFolderImpl.java @@ -91,12 +91,16 @@ public class LocalFolderImpl extends LocalImpl implements VFSContainer { /** * @see org.olat.core.util.vfs.VFSContainer#getItems(org.olat.core.util.vfs.filters.VFSItemFilter) */ + @Override public List<VFSItem> getItems(VFSItemFilter filter) { File aFolder = getBasefile(); if(! aFolder.isDirectory()){ throw new AssertException("basefile is not a directory: "+aFolder.getAbsolutePath()); } File[] children = aFolder.listFiles(); + if(children == null) { + children = new File[0]; + } int len = children.length; List<VFSItem> res = new ArrayList<VFSItem>(len); diff --git a/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java b/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java index 6e92ef67e157cc9068617270e7ad700424abff11..64fc5a727688b9e6e772f3f28e75e4bd33225860 100644 --- a/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java +++ b/src/main/java/org/olat/portfolio/ui/EPTemplateRuntimeController.java @@ -53,7 +53,6 @@ public class EPTemplateRuntimeController extends RepositoryEntryRuntimeControlle if(getRuntimeController() instanceof EPMapViewController) { EPMapViewController mapCtrl = (EPMapViewController)getRuntimeController(); if(mapCtrl.canEditStructure()) { - mapCtrl.delegateEditButton(); editLink = LinkFactory.createToolLink("edit.cmd", translate("details.openeditor"), this, "o_sel_repository_editor"); editLink.setElementCssClass("o_sel_ep_edit_map"); editLink.setIconLeftCSS("o_icon o_icon-lg o_icon_edit"); diff --git a/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java b/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java index eec057fcf9b766531d586e19f2494ade0e2b38e2..191629607d3e15f71f8f03f423dc01031efb0758 100644 --- a/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java +++ b/src/main/java/org/olat/portfolio/ui/structel/EPMapViewController.java @@ -81,7 +81,6 @@ public class EPMapViewController extends BasicController implements Activateable private EPStructureTreeAndDetailsEditController editCtrl; private DialogBoxController confirmationSubmissionCtr; private final boolean back; - private boolean editInToolbar = false; private EditMode editMode = EditMode.view; private PortfolioStructureMap map; @@ -135,12 +134,6 @@ public class EPMapViewController extends BasicController implements Activateable return secCallback.canEditStructure(); } - public void delegateEditButton() { - if(editButton != null) { - editButton.setVisible(false); - } - } - protected void initForm(UserRequest ureq) { Identity ownerIdentity = ePFMgr.getFirstOwnerIdentity(map); if(ownerIdentity != null) { @@ -161,9 +154,6 @@ public class EPMapViewController extends BasicController implements Activateable } else { editButton.setCustomDisplayText(translate("map.editButton.off")); } - if(editInToolbar) { - mainVc.remove(mainVc.getComponent("map.editButton")); - } } if(back) { backLink = LinkFactory.createLinkBack(mainVc, this); @@ -262,6 +252,7 @@ public class EPMapViewController extends BasicController implements Activateable selectedPage = pageCtrl.getSelectedPage(); } initOrUpdateEditMode(ureq, selectedPage); + editMode = EditMode.editor; } }