From ae8d0cfc0b2b2a1617867a8605dfb56047d69f6d Mon Sep 17 00:00:00 2001 From: strentini <none@none> Date: Wed, 21 Mar 2012 10:34:23 +0100 Subject: [PATCH] OO-179 : extend the group REST api to allow the export of group wikis --- .../org/olat/modules/wiki/WikiToCPExport.java | 2 +- .../wiki/restapi/GroupWikiWebService.java | 67 ++++++++++++++ .../modules/wiki/restapi/WikiWebService.java | 88 +++++-------------- .../wiki/restapi/WikiWebServiceHelper.java | 87 ++++++++++++++++++ .../modules/wiki/restapi/WikisWebService.java | 12 +-- .../group/LearningGroupWebService.java | 30 +++++++ 6 files changed, 210 insertions(+), 76 deletions(-) create mode 100644 src/main/java/org/olat/modules/wiki/restapi/GroupWikiWebService.java create mode 100644 src/main/java/org/olat/modules/wiki/restapi/WikiWebServiceHelper.java diff --git a/src/main/java/org/olat/modules/wiki/WikiToCPExport.java b/src/main/java/org/olat/modules/wiki/WikiToCPExport.java index 1f30288a550..0780c004db5 100644 --- a/src/main/java/org/olat/modules/wiki/WikiToCPExport.java +++ b/src/main/java/org/olat/modules/wiki/WikiToCPExport.java @@ -83,7 +83,7 @@ public class WikiToCPExport { /** * - * @param ores the repositoryEntry of the wiki. this can also be the business-group, if the wiki is in a group + * @param ores the repositoryEntry of the wiki OR the businessGroup, if the wiki is in a group * @param ident * @param trans */ diff --git a/src/main/java/org/olat/modules/wiki/restapi/GroupWikiWebService.java b/src/main/java/org/olat/modules/wiki/restapi/GroupWikiWebService.java new file mode 100644 index 00000000000..570b046d1eb --- /dev/null +++ b/src/main/java/org/olat/modules/wiki/restapi/GroupWikiWebService.java @@ -0,0 +1,67 @@ +/** + * <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.modules.wiki.restapi; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.GET; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.olat.group.BusinessGroup; + +/** + * + * The Group Wiki Webservice<br /> + * allows the export of group wikis + * + * @author strentini, sergio.trentini@frentix.com, http://www.frentix.com + * + */ +public class GroupWikiWebService { + + + private BusinessGroup learningGroup; + + public GroupWikiWebService(BusinessGroup group) { + learningGroup = group; + } + + /** + * will export the wiki from the current group to a CP and serve as + * zip-file.<br /> + * + * @param request + * @param response + * @return + */ + @GET + @Produces({ "application/zip", MediaType.APPLICATION_OCTET_STREAM }) + public Response exportWiki(@Context HttpServletRequest request, @Context HttpServletResponse response) { + if (learningGroup == null) + return Response.serverError().status(Status.BAD_REQUEST).build(); + + return WikiWebServiceHelper.serve(learningGroup, request, response); + } + +} diff --git a/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java b/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java index 8581b1df553..c627097271f 100644 --- a/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java +++ b/src/main/java/org/olat/modules/wiki/restapi/WikiWebService.java @@ -19,9 +19,6 @@ */ package org.olat.modules.wiki.restapi; -import java.io.File; -import java.util.Locale; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.GET; @@ -32,24 +29,11 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.olat.core.commons.modules.bc.vfs.OlatRootFileImpl; -import org.olat.core.gui.media.CleanupAfterDeliveryFileMediaResource; -import org.olat.core.gui.media.MediaResource; -import org.olat.core.gui.media.ServletUtil; -import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.core.util.Util; -import org.olat.core.util.vfs.LocalFileImpl; import org.olat.fileresource.types.WikiResource; -import org.olat.modules.fo.restapi.ForumWebService; -import org.olat.modules.wiki.WikiMainController; -import org.olat.modules.wiki.WikiToCPExport; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; -import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; import org.olat.restapi.security.RestSecurityHelper; @@ -62,7 +46,6 @@ import org.olat.restapi.security.RestSecurityHelper; * */ public class WikiWebService { - private static final OLog log = Tracing.createLoggerFor(ForumWebService.class); /** * will export the specified wiki (which must be a repo-entry-wiki) to a CP @@ -80,16 +63,33 @@ public class WikiWebService { public Response exportWiki(@PathParam("wikiKey") String wikiKey, @Context HttpServletRequest request, @Context HttpServletResponse response) { if (wikiKey == null) return Response.serverError().status(Status.BAD_REQUEST).build(); - + try { - RepositoryEntry re = getExportableWikiRepoEntryByAnyKey(wikiKey); - return serveWiki(re, request, response); + return getWikiEntryAndServe(wikiKey,request,response); } catch (Exception e) { return Response.serverError().status(Status.NOT_FOUND).build(); } } + /** + * + * @param wikiKey + * @param request + * @param response + * @return + * @throws Exception + */ + private Response getWikiEntryAndServe(String wikiKey, HttpServletRequest request, HttpServletResponse response) throws Exception { + RepositoryEntry wikiEntry = getExportableWikiRepoEntryByAnyKey(wikiKey); + if (isRESTUserAllowedToExportWiki(wikiEntry, request)) { + RepositoryManager.getInstance().incrementDownloadCounter(wikiEntry); + return WikiWebServiceHelper.serve(wikiEntry.getOlatResource(), request, response); + } else { + return Response.serverError().status(Status.FORBIDDEN).build(); + } + } + /** * gets an exportable wiki by it's key.<br /> * key can be either: resourceable id, softkey or repository-id<br /> @@ -136,58 +136,18 @@ public class WikiWebService { } /** + * check access of current REST user to the given wikiRepoEntry. Current + * REST user must be the owner of the repoEntry or an OpenOLAT author * * @param wikiEntry * @param request - * @param response * @return */ - private Response serveWiki(RepositoryEntry wikiEntry, HttpServletRequest request, HttpServletResponse response) { + private boolean isRESTUserAllowedToExportWiki(RepositoryEntry wikiEntry, HttpServletRequest request) { Identity ident = RestSecurityHelper.getIdentity(request); - - // check if current REST user is allowed to export the wiki resource boolean isAuthor = RestSecurityHelper.isAuthor(request); boolean isOwner = RepositoryManager.getInstance().isOwnerOfRepositoryEntry(ident, wikiEntry); - if (!(isAuthor | isOwner)) { - // current REST user is neither author nor owner -> do not allow - // export - return Response.serverError().status(Status.UNAUTHORIZED).build(); - } - // count download - RepositoryManager.getInstance().incrementDownloadCounter(wikiEntry); - return serve(wikiEntry, ident, request, response); - } - - /** - * finally exports the ores and serves the zip file - * - * @param ores - * @param ident - * @param request - * @param response - * @return - */ - private Response serve(RepositoryEntry repoEntry, Identity ident, HttpServletRequest request, HttpServletResponse response) { - - // get the underlying OLAT resource - OLATResource wikiResource = repoEntry.getOlatResource(); - Translator translator = Util.createPackageTranslator(WikiMainController.class, new Locale(ident.getUser().getPreferences().getLanguage())); - WikiToCPExport exportUtil = new WikiToCPExport(wikiResource, ident, translator); - LocalFileImpl tmpExport = new OlatRootFileImpl("/tmp/" + ident.getKey() + "-" + wikiResource.getResourceableId() + "-restexport.zip", null); - exportUtil.archiveWikiToCP(tmpExport); - - // export is done, serve the file - File baseFile = tmpExport.getBasefile(); - if (baseFile.exists() && baseFile.canRead()) { - // make mediaResource - MediaResource cpMediaResource = new CleanupAfterDeliveryFileMediaResource(baseFile); - // use servletUtil, so file gets deleted afterwards - ServletUtil.serveResource(request, response, cpMediaResource); - return Response.ok().build(); - } else { - log.warn("Exported wiki to " + baseFile.getAbsolutePath() + " but now it's not readable for serving to client..."); - return Response.serverError().status(Status.NOT_FOUND).build(); - } + return isAuthor || isOwner; } } diff --git a/src/main/java/org/olat/modules/wiki/restapi/WikiWebServiceHelper.java b/src/main/java/org/olat/modules/wiki/restapi/WikiWebServiceHelper.java new file mode 100644 index 00000000000..d110058f0aa --- /dev/null +++ b/src/main/java/org/olat/modules/wiki/restapi/WikiWebServiceHelper.java @@ -0,0 +1,87 @@ +/** + * <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.modules.wiki.restapi; + +import java.io.File; +import java.util.Locale; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.olat.core.commons.modules.bc.vfs.OlatRootFileImpl; +import org.olat.core.gui.media.CleanupAfterDeliveryFileMediaResource; +import org.olat.core.gui.media.MediaResource; +import org.olat.core.gui.media.ServletUtil; +import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.Util; +import org.olat.core.util.vfs.LocalFileImpl; +import org.olat.modules.fo.restapi.ForumWebService; +import org.olat.modules.wiki.WikiMainController; +import org.olat.modules.wiki.WikiToCPExport; +import org.olat.restapi.security.RestSecurityHelper; + +/** + * + * Exports a given wikiResource (specified by it's Repository-Entry OR + * LearningGroup) to a CP and serves the File + * + * @author strentini, sergio.trentini@frentix.com, http://www.frentix.com + * + */ +public class WikiWebServiceHelper { + private static final OLog log = Tracing.createLoggerFor(ForumWebService.class); + + /** + * exports the wiki-Resource and serves the zip file. The given + * OLATResourceable can be the repository-entry of the wiki or the + * businessGroup (if it is a group-wiki) + * + * @param wikiResource + * @param request + * @param response + * @return + */ + public static Response serve(OLATResourceable wikiResource, HttpServletRequest request, HttpServletResponse response) { + Identity ident = RestSecurityHelper.getIdentity(request); + Translator translator = Util.createPackageTranslator(WikiMainController.class, new Locale(ident.getUser().getPreferences().getLanguage())); + WikiToCPExport exportUtil = new WikiToCPExport(wikiResource, ident, translator); + LocalFileImpl tmpExport = new OlatRootFileImpl("/tmp/" + ident.getKey() + "-" + wikiResource.getResourceableId() + "-restexport.zip", null); + exportUtil.archiveWikiToCP(tmpExport); + + // export is done, serve the file + File baseFile = tmpExport.getBasefile(); + if (baseFile.exists() && baseFile.canRead()) { + // make mediaResource + MediaResource cpMediaResource = new CleanupAfterDeliveryFileMediaResource(baseFile); + // use servletUtil, so file gets deleted afterwards + ServletUtil.serveResource(request, response, cpMediaResource); + return Response.ok().build(); + } else { + log.error("Exported wiki to " + baseFile.getAbsolutePath() + " but now it's not readable for serving to client..."); + return Response.serverError().status(Status.NOT_FOUND).build(); + } + } +} diff --git a/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java b/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java index 6bc75e5452f..b7d7266adb2 100644 --- a/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java +++ b/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java @@ -22,36 +22,26 @@ package org.olat.modules.wiki.restapi; import static org.olat.restapi.security.RestSecurityHelper.getIdentity; import static org.olat.restapi.security.RestSecurityHelper.getRoles; -import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.apache.commons.lang.ArrayUtils; -import org.olat.collaboration.CollaborationTools; -import org.olat.collaboration.CollaborationToolsFactory; import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.fileresource.types.WikiResource; -import org.olat.group.BusinessGroup; -import org.olat.group.BusinessGroupManager; -import org.olat.group.BusinessGroupManagerImpl; import org.olat.modules.wiki.restapi.vo.WikiVO; import org.olat.modules.wiki.restapi.vo.WikiVOes; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.SearchRepositoryEntryParameters; -import org.olat.restapi.security.RestSecurityHelper; /** * @@ -76,7 +66,7 @@ public class WikisWebService { } /** - * get list of wikis + * get list of repo-entry wikis. Group-Wikis are not listed! * * @param start * @param limit diff --git a/src/main/java/org/olat/restapi/group/LearningGroupWebService.java b/src/main/java/org/olat/restapi/group/LearningGroupWebService.java index 0f37c0c6bf2..e44b87fe4e5 100644 --- a/src/main/java/org/olat/restapi/group/LearningGroupWebService.java +++ b/src/main/java/org/olat/restapi/group/LearningGroupWebService.java @@ -71,6 +71,7 @@ import org.olat.group.properties.BusinessGroupPropertyManager; import org.olat.group.ui.BGConfigFlags; import org.olat.modules.fo.Forum; import org.olat.modules.fo.restapi.ForumWebService; +import org.olat.modules.wiki.restapi.GroupWikiWebService; import org.olat.restapi.security.RestSecurityHelper; import org.olat.restapi.support.ObjectFactory; import org.olat.restapi.support.vo.GroupInfoVO; @@ -352,6 +353,35 @@ public class LearningGroupWebService { return new VFSWebservice(rootContainer); } + + /** + * Return the Forum web service + * @param groupKey The key of the group + * @param request The HTTP Request + * @return + */ + @Path("{groupKey}/wiki") + public GroupWikiWebService getWiki(@PathParam("groupKey") Long groupKey, @Context HttpServletRequest request) { + BusinessGroupManager bgm = BusinessGroupManagerImpl.getInstance(); + BusinessGroup bg = bgm.loadBusinessGroup(groupKey, false); + if(bg == null) { + return null; + } + + if(!isGroupManager(request)) { + Identity identity = RestSecurityHelper.getIdentity(request); + if(!bgm.isIdentityInBusinessGroup(identity, bg)) { + return null; + } + } + + CollaborationTools collabTools = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(bg); + if(collabTools.isToolEnabled(CollaborationTools.TOOL_WIKI)) { + return new GroupWikiWebService(bg); + } + return null; + } + /** * Returns the list of owners of the group specified by the groupKey. * @response.representation.200.qname {http://www.example.com}userVO -- GitLab