diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java index a839876dff41ee538fd26413843b23d73ad7eb81..c3b1f4bf1b37e4b0b3a47e0a451662f6f7189efe 100644 --- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java +++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java @@ -61,6 +61,9 @@ import org.olat.fileresource.types.XlsFileResource; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; import org.olat.repository.model.RepositoryEntrySecurity; +import org.olat.repository.ui.RepositoryEntryRuntimeController; +import org.olat.repository.ui.RepositoryEntryRuntimeController.RuntimeControllerCreator; +import org.olat.repository.ui.WebDocumentRunController; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; @@ -190,7 +193,7 @@ public class WebDocumentHandler extends FileHandler { @Override public boolean supportsLaunch() { - return false; + return true; } @Override @@ -210,7 +213,13 @@ public class WebDocumentHandler extends FileHandler { @Override public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl) { - return null; + return new RepositoryEntryRuntimeController(ureq, wControl, re, reSecurity, new RuntimeControllerCreator() { + @Override + public Controller create(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, + RepositoryEntry entry, RepositoryEntrySecurity reSecurity) { + return new WebDocumentRunController(ureq, wControl, entry); + } + }); } @Override diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java index b09d508d05154263d094d9c2082c6bf67ddb0ad7..87feb3eef8c9a0aea6bcc7192839844f24db8f84 100644 --- a/src/main/java/org/olat/repository/handlers/WikiHandler.java +++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java @@ -307,16 +307,13 @@ public class WikiHandler implements RepositoryHandler { String fullFilePath = archivFilePath + File.separator + exportFileName; File fExportZIP = new File(fullFilePath); - InputStream fis = wikiZip.getInputStream(); - - try { - FileUtils.bcopy(wikiZip.getInputStream(), fExportZIP, "archive wiki"); + + try (InputStream fis = wikiZip.getInputStream()) { + FileUtils.bcopy(fis, fExportZIP, "archive wiki"); } catch (FileNotFoundException e) { log.warn("Can not archive wiki repoEntry=" + repoEntry); } catch (IOException ioe) { log.warn("Can not archive wiki repoEntry=" + repoEntry); - } finally { - FileUtils.closeSafely(fis); } return exportFileName; } diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java index e6ab1adef20201bc283143e8032a57c8efb4fdee..da3120e98109509386438c8d6cee9b07a86cb1b6 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java +++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java @@ -812,9 +812,13 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController protected void launchContent(UserRequest ureq, RepositoryEntrySecurity security) { if(security.canLaunch()) { - runtimeController = runtimeControllerCreator.create(ureq, getWindowControl(), toolbarPanel, re, reSecurity); - listenTo(runtimeController); - toolbarPanel.rootController(re.getDisplayname(), runtimeController); + if(handler.supportsLaunch()) { + runtimeController = runtimeControllerCreator.create(ureq, getWindowControl(), toolbarPanel, re, reSecurity); + listenTo(runtimeController); + toolbarPanel.rootController(re.getDisplayname(), runtimeController); + } else { + doDetails(ureq); + } } else { runtimeController = new AccessRefusedController(ureq, getWindowControl()); listenTo(runtimeController); diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java new file mode 100644 index 0000000000000000000000000000000000000000..50e12c42acd869acd6bd7deb2dc0901dce34e1e1 --- /dev/null +++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java @@ -0,0 +1,119 @@ +package org.olat.repository.ui; + +import javax.servlet.http.HttpServletRequest; + +import org.olat.core.CoreSpringFactory; +import org.olat.core.commons.services.image.Size; +import org.olat.core.commons.services.video.MovieService; +import org.olat.core.dispatcher.mapper.Mapper; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.velocity.VelocityContainer; +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.gui.control.generic.iframe.IFrameDisplayController; +import org.olat.core.gui.media.MediaResource; +import org.olat.core.gui.util.CSSHelper; +import org.olat.core.helpers.Settings; +import org.olat.core.util.FileUtils; +import org.olat.core.util.vfs.LocalFileImpl; +import org.olat.core.util.vfs.LocalImpl; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.VFSMediaResource; +import org.olat.fileresource.FileResourceManager; +import org.olat.repository.RepositoryEntry; +import org.olat.resource.OLATResource; + +/** + * + * Initial date: 02.12.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class WebDocumentRunController extends BasicController { + + public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) { + super(ureq, wControl); + + VelocityContainer mainVC = createVelocityContainer("web_content"); + mainVC.contextPut("displayName", entry.getDisplayname()); + putInitialPanel(mainVC); + + LocalFileImpl document = getWebDocument(entry); + if(document != null) { + String filename = document.getName(); + mainVC.contextPut("filename", filename); + String lowerFilename = filename.toLowerCase(); + String cssClass = CSSHelper.createFiletypeIconCssClassFor(lowerFilename); + mainVC.contextPut("cssClass", cssClass); + + String extension = FileUtils.getFileSuffix(filename); + if("png".equals(extension) || "jpg".equals(extension) || "jpeg".equals(extension) || "gif".equals(extension)) { + String mediaUrl = registerMapper(ureq, new MediaMapper(document)); + mainVC.contextPut("image", filename); + mainVC.contextPut("mediaUrl", mediaUrl); + } else if("mp4".equals(extension) || "m4v".equals(extension) || "mov".equals(extension)) { + String mediaUrl = registerMapper(ureq, new MediaMapper(document)); + mainVC.contextPut("movie", filename); + mainVC.contextPut("mediaUrl", Settings.createServerURI() + mediaUrl); + Size realSize = CoreSpringFactory.getImpl(MovieService.class).getSize(document, extension); + if(realSize != null) { + mainVC.contextPut("height", realSize.getHeight()); + mainVC.contextPut("width", realSize.getWidth()); + } else { + mainVC.contextPut("height", 480); + mainVC.contextPut("width", 640); + } + } else { + IFrameDisplayController idc = new IFrameDisplayController(ureq, getWindowControl(), document.getParentContainer(), null, null); + listenTo(idc); + idc.setCurrentURI(document.getName()); + mainVC.put("content", idc.getInitialComponent()); + } + } + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + // + } + + private LocalFileImpl getWebDocument(RepositoryEntry entry) { + OLATResource resource = entry.getOlatResource(); + VFSContainer fResourceFileroot = FileResourceManager.getInstance() + .getFileResourceRootImpl(resource); + + LocalFileImpl document = null; + for(VFSItem item:fResourceFileroot.getItems()) { + if(item instanceof VFSLeaf && item instanceof LocalImpl) { + LocalFileImpl localItem = (LocalFileImpl)item; + if(localItem != null && !localItem.getBasefile().isHidden()) { + document = (LocalFileImpl)item; + } + } + } + return document; + } + + private static class MediaMapper implements Mapper { + + private final VFSLeaf mediaFile; + + public MediaMapper(VFSLeaf mediaFile) { + this.mediaFile = mediaFile; + } + + @Override + public MediaResource handle(String relPath, HttpServletRequest request) { + return new VFSMediaResource(mediaFile); + } + } +} diff --git a/src/main/java/org/olat/repository/ui/_content/web_content.html b/src/main/java/org/olat/repository/ui/_content/web_content.html new file mode 100644 index 0000000000000000000000000000000000000000..abe13c528fcd85b539a0bc351bf91f51ccdf42fa --- /dev/null +++ b/src/main/java/org/olat/repository/ui/_content/web_content.html @@ -0,0 +1,14 @@ +<h2><i class="o_icon $cssClass"> </i> $displayName</h2> +#if($image) + <img src="$mediaUrl/$filename" /> +#elseif($movie) + <p><span id="olatFlashMovieViewer1" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:${width}px; height:${height}px;"> + <script defer="defer" type="text/javascript"> + // <![CDATA[ + BPlayer.insertPlayer('$mediaUrl/$filename','olatFlashMovieViewer1',$width,$height,0,0,'video',undefined,false,true,false); + // ]]> + </script> + </span></p> +#elseif($r.available("content")) + <div class="o_content clearfix">$r.render("content")</div> +#end \ No newline at end of file diff --git a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java index 4884adb458c0cd88abc3ddb01d189b3b56365a8b..2013f8137497409fe228090169430c843e8fa03d 100644 --- a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java +++ b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java @@ -53,6 +53,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; +import org.olat.core.util.i18n.I18nManager; import org.olat.core.util.vfs.LocalFileImpl; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; @@ -97,8 +98,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { private static final int movieUploadlimitKB = 102400; private FileElement fileUpload, movieUpload; - private SingleSelection language; - private TextElement externalRef, displayName, authors, expenditureOfWork; + private TextElement externalRef, displayName, authors, expenditureOfWork, language; private RichTextElement description, objectives, requirements, credits; private SingleSelection dateTypesEl, publicDatesEl; private DateChooser startDateEl, endDateEl; @@ -108,6 +108,8 @@ public class RepositoryEditDescriptionController extends FormBasicController { private static final String[] dateKeys = new String[]{ "none", "private", "public"}; + @Autowired + private I18nManager i18nmanager; @Autowired private UserManager userManager; @Autowired @@ -198,16 +200,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { authors = uifactory.addTextElement("cif.authors", "cif.authors", 255, repositoryEntry.getAuthors(), descCont); authors.setDisplaySize(60); - String[] languageKeys = new String[] { "de", "en"}; - String[] languageValues = new String[] { "de", "en"}; - language = uifactory.addDropdownSingleselect("cif.mainLanguage", "cif.mainLanguage", formLayout, languageKeys, languageValues, null); - String selected = languageKeys[0]; - for(String languageKey:languageKeys) { - if(languageKey.equals(repositoryEntry.getMainLanguage())) { - selected = languageKey; - } - } - language.select(selected, true); + language = uifactory.addTextElement("cif.mainLanguage", "cif.mainLanguage", 16, repositoryEntry.getMainLanguage(), descCont); RepositoryHandler handler = RepositoryHandlerFactory.getInstance().getRepositoryHandler(repositoryEntry); mediaContainer = handler.getMediaContainer(repositoryEntry); @@ -277,7 +270,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { updateDatesVisibility(); uifactory.addSpacerElement("spacer3", descCont, false); - + expenditureOfWork = uifactory.addTextElement("cif.expenditureOfWork", "cif.expenditureOfWork", 100, repositoryEntry.getExpenditureOfWork(), descCont); expenditureOfWork.setExampleKey("details.expenditureOfWork.example", null); @@ -492,7 +485,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { String displayname = displayName.getValue().trim(); repositoryEntry.setDisplayname(displayname); - String mainLanguage = language.getSelectedKey(); + String mainLanguage = language.getValue(); if(StringHelper.containsNonWhitespace(mainLanguage)) { repositoryEntry.setMainLanguage(mainLanguage); } else { diff --git a/src/main/java/org/olat/repository/ui/list/_content/details.html b/src/main/java/org/olat/repository/ui/list/_content/details.html index d83f646c6dd9a71d2799725b3bac1cf0d3c47096..e26ce4049fdfa2b9bc6b6da47dfa466f56466c16 100644 --- a/src/main/java/org/olat/repository/ui/list/_content/details.html +++ b/src/main/java/org/olat/repository/ui/list/_content/details.html @@ -46,7 +46,7 @@ #if($v.lifecycle.validTo) - $r.formatDate($v.lifecycle.validTo) #end </div> #end - #if($v.expenditureOfWork) + #if($v.expenditureOfWork && !$v.expenditureOfWork.empty) <div title="$r.translateInAttribute("details.expenditureOfWork.desc")"> <i class="o_icon o_icon_expenditure"></i> $r.escapeHtml($v.expenditureOfWork)