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