From 486d98ab42926ac838cee89af7d9fdeef4af6f90 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 26 Sep 2012 16:06:19 +0200
Subject: [PATCH] OO-347: make the course import of the REST API a real import
 and not a "deploy" one

---
 .../java/org/olat/course/CourseFactory.java   |   2 +-
 src/main/java/org/olat/course/ICourse.java    |   2 +
 .../org/olat/course/PersistingCourseImpl.java |  10 +
 .../repository/ImportCourseController.java    |  29 +--
 .../ImportPortfolioReferencesController.java  |   2 +-
 .../ImportReferencesController.java           |   2 +-
 ...mportSharedfolderReferencesController.java |   1 -
 .../controllers/RepositoryAddController.java  |   1 -
 .../course/CourseElementWebService.java       |   5 +-
 .../repository/course/CoursesWebService.java  | 181 ++++++++++++++----
 .../org/olat/restapi/Course_with_blog.zip     | Bin 0 -> 20281 bytes
 .../java/org/olat/restapi/CoursesTest.java    |   2 +-
 12 files changed, 172 insertions(+), 65 deletions(-)
 create mode 100644 src/test/java/org/olat/restapi/Course_with_blog.zip

diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java
index 7118b555010..89dad79142e 100644
--- a/src/main/java/org/olat/course/CourseFactory.java
+++ b/src/main/java/org/olat/course/CourseFactory.java
@@ -593,7 +593,7 @@ public class CourseFactory extends BasicManager {
 			Tracing.logError("Error deploying course from ZIP: " + exportedCourseZIPFile.getAbsolutePath(), CourseFactory.class);
 			return null;
 		}
-		File courseExportData = ImportCourseController.getExportDataDir(course);
+		File courseExportData = course.getCourseExportDataDir().getBasefile();
 		// get the export data directory
 		// create the repository entry
 		RepositoryEntry re = repositoryManager.createRepositoryEntryInstance("administrator");
diff --git a/src/main/java/org/olat/course/ICourse.java b/src/main/java/org/olat/course/ICourse.java
index 47964e0e069..f6b009f2cf8 100644
--- a/src/main/java/org/olat/course/ICourse.java
+++ b/src/main/java/org/olat/course/ICourse.java
@@ -81,6 +81,8 @@ public interface ICourse extends OLATResourceable {
 	 * @return the container to the coursefolder of this course
 	 */
 	public VFSContainer getCourseFolderContainer();
+	
+	public OlatRootFolderImpl getCourseExportDataDir();
 
 	/**
 	 * @return The course title. This is the display name of the course repository entry
diff --git a/src/main/java/org/olat/course/PersistingCourseImpl.java b/src/main/java/org/olat/course/PersistingCourseImpl.java
index 1e3c09bd902..42f6ce84cd6 100644
--- a/src/main/java/org/olat/course/PersistingCourseImpl.java
+++ b/src/main/java/org/olat/course/PersistingCourseImpl.java
@@ -43,6 +43,7 @@ import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.tree.TreeVisitor;
 import org.olat.core.util.tree.Visitor;
+import org.olat.core.util.vfs.LocalImpl;
 import org.olat.core.util.vfs.MergeSource;
 import org.olat.core.util.vfs.NamedContainerImpl;
 import org.olat.core.util.vfs.Quota;
@@ -153,6 +154,15 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ
 	public OlatRootFolderImpl getCourseBaseContainer() {
 		return courseRootContainer;
 	}
+	
+	@Override
+	public OlatRootFolderImpl getCourseExportDataDir() {
+		OlatRootFolderImpl vfsExportDir = (OlatRootFolderImpl)getCourseBaseContainer().resolve(ICourse.EXPORTED_DATA_FOLDERNAME);
+		if (vfsExportDir == null) {
+			vfsExportDir = (OlatRootFolderImpl)getCourseBaseContainer().createChildContainer(ICourse.EXPORTED_DATA_FOLDERNAME);
+		}
+		return vfsExportDir;
+	}
 
 	/**
 	 * @see org.olat.course.ICourse#getCourseFolderPath()
diff --git a/src/main/java/org/olat/course/repository/ImportCourseController.java b/src/main/java/org/olat/course/repository/ImportCourseController.java
index 6aee8b5d420..02bd32174ed 100644
--- a/src/main/java/org/olat/course/repository/ImportCourseController.java
+++ b/src/main/java/org/olat/course/repository/ImportCourseController.java
@@ -128,7 +128,7 @@ public class ImportCourseController extends BasicController implements IAddContr
 		// create group management
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
 		// import groups
-		CourseEnvironmentMapper envMapper = cgm.importCourseBusinessGroups(getExportDataDir(course));
+		CourseEnvironmentMapper envMapper = cgm.importCourseBusinessGroups(course.getCourseExportDataDir().getBasefile());
 		//upgrade to the current version of the course
 		ICourse course = CourseFactory.loadCourse(cgm.getCourseResource());
 		course.postImport(envMapper);
@@ -193,12 +193,6 @@ public class ImportCourseController extends BasicController implements IAddContr
 	 */
 	public void event(UserRequest ureq, Component source, Event event) {
 		//nothing to do
-/*		if (source == finishedMessage) {
-			getWindowControl().pop();
-			// save the editor tree model, to persist any changes made during import.
-			course.saveEditorTreeModel();
-			callback.finished(ureq);
-		}*/
 	}
 
 	/**
@@ -342,7 +336,7 @@ public class ImportCourseController extends BasicController implements IAddContr
 	private void processSharedFolder(UserRequest ureq) {
 		// if shared folder controller exists we did already import this one.
 		if (sharedFolderImportController == null) {
-			RepositoryEntryImportExport sfImportExport = SharedFolderManager.getInstance().getRepositoryImportExport(getExportDataDir(course));
+			RepositoryEntryImportExport sfImportExport = SharedFolderManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile());
 			
 			removeAsListenerAndDispose(sharedFolderImportController);
 			sharedFolderImportController = new ImportSharedfolderReferencesController(sfImportExport, course, ureq, getWindowControl());
@@ -355,7 +349,7 @@ public class ImportCourseController extends BasicController implements IAddContr
 	private void processGlossary(UserRequest ureq) {
 		// if glossary controller exists we did already import this one.
 		if (glossaryImportController == null) {
-			RepositoryEntryImportExport sfImportExport = GlossaryManager.getInstance().getRepositoryImportExport(getExportDataDir(course));
+			RepositoryEntryImportExport sfImportExport = GlossaryManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile());
 			
 			removeAsListenerAndDispose(glossaryImportController);
 			glossaryImportController = new ImportGlossaryReferencesController(sfImportExport, course, ureq, getWindowControl());
@@ -367,7 +361,7 @@ public class ImportCourseController extends BasicController implements IAddContr
 	
 	private void cleanupExportDataDir() {
 		if (course == null) return;
-		File fExportedDataDir = getExportDataDir(course);
+		File fExportedDataDir = course.getCourseExportDataDir().getBasefile();
 		if (fExportedDataDir.exists())
 			FileUtils.deleteDirsAndFiles(fExportedDataDir, true, true);
 	}
@@ -400,7 +394,7 @@ public class ImportCourseController extends BasicController implements IAddContr
 		while (nodeListPos < nodeList.size()) {
 			CourseEditorTreeNode nextNode = nodeList.get(nodeListPos);
 			nodeListPos++;
-			Controller ctrl = nextNode.getCourseNode().importNode(getExportDataDir(course), course, false, ureq, getWindowControl());
+			Controller ctrl = nextNode.getCourseNode().importNode(course.getCourseExportDataDir().getBasefile(), course, false, ureq, getWindowControl());
 			if (ctrl != null) {
 				// this node needs a controller to do its import job.
 				removeAsListenerAndDispose(activeImportController);
@@ -426,19 +420,6 @@ public class ImportCourseController extends BasicController implements IAddContr
 		return true;
 	}
 	
-	/**
-	 * The folder where nodes export their data to.
-	 * 
-	 * @param theCourse
-	 * @return File
-	 */
-	public static File getExportDataDir(ICourse theCourse) {
-		LocalImpl vfsExportDir = (LocalImpl)theCourse.getCourseBaseContainer().resolve(ICourse.EXPORTED_DATA_FOLDERNAME);
-		if (vfsExportDir == null)
-			vfsExportDir = (OlatRootFolderImpl)theCourse.getCourseBaseContainer().createChildContainer(ICourse.EXPORTED_DATA_FOLDERNAME);
-		return vfsExportDir.getBasefile();
-	}
-	
 	protected void doDispose() {
 		if (course != null) CourseFactory.closeCourseEditSession(course.getResourceableId(), false);
 	}
diff --git a/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java b/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java
index 4b3bfacf777..3dc6bafb2b1 100644
--- a/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java
+++ b/src/main/java/org/olat/course/repository/ImportPortfolioReferencesController.java
@@ -115,7 +115,7 @@ public class ImportPortfolioReferencesController extends BasicController {
 		putInitialPanel(mainPanel);
 	}
 
-	protected void importWithoutAsking (UserRequest ureq) {
+	public void importWithoutAsking (UserRequest ureq) {
 		event (ureq, importButton, Event.DONE_EVENT);
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
diff --git a/src/main/java/org/olat/course/repository/ImportReferencesController.java b/src/main/java/org/olat/course/repository/ImportReferencesController.java
index 39b1ff92ab3..b7ab591175f 100644
--- a/src/main/java/org/olat/course/repository/ImportReferencesController.java
+++ b/src/main/java/org/olat/course/repository/ImportReferencesController.java
@@ -153,7 +153,7 @@ public class ImportReferencesController extends BasicController {
 		putInitialPanel(mainPanel);
 	}
 	
-	protected void importWithoutAsking (UserRequest ureq) {
+	public void importWithoutAsking (UserRequest ureq) {
 		//isolate the transaction
 		try {
 			DBFactory.getInstance().commitAndCloseSession();
diff --git a/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java b/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java
index cf100e0c6b3..5c0c34f9713 100644
--- a/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java
+++ b/src/main/java/org/olat/course/repository/ImportSharedfolderReferencesController.java
@@ -123,7 +123,6 @@ public class ImportSharedfolderReferencesController extends BasicController {
 				getWindowControl().setError("Import failed.");
 				return;
 			}
-			Translator repoTranslator = new PackageTranslator(Util.getPackageName(RepositoryManager.class), ureq.getLocale());
 			removeAsListenerAndDispose(repoDetailsForm);
 			repoDetailsForm = new DetailsReadOnlyForm(ureq, getWindowControl(), importedRepositoryEntry, SharedFolderFileResource.TYPE_NAME, false);
 			listenTo(repoDetailsForm);
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java
index a9ca18fddd6..d6d6ee85546 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryAddController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryAddController.java
@@ -433,7 +433,6 @@ public class RepositoryAddController extends BasicController {
 				translate("add.header.specific", new String[] {translate(ores.getResourceableTypeName())}));
 		repositoryadd.setPage(VELOCITY_ROOT + "/addDetails.html");
 		
-		System.out.println("rrrrrrrrrrr addFinished Commit and close");
 		DBFactory.getInstance().commitAndCloseSession();
 	}
 
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
index 7269db36519..f4c8f398d95 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
@@ -1561,9 +1561,8 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 		Boolean isSolutionEnabled = (Boolean)moduleConfig.get(TACourseNode.CONF_SOLUTION_ENABLED);
 		config.setIsSolutionEnabled(isSolutionEnabled == null ? Boolean.TRUE : isSolutionEnabled);
 		//get the conditions
-		List lstConditions = courseNode.getConditionExpressions();
-		for(Object obj : lstConditions) {
-			ConditionExpression cond = (ConditionExpression) obj;
+		List<ConditionExpression> lstConditions = courseNode.getConditionExpressions();
+		for(ConditionExpression cond : lstConditions) {
 			String id = cond.getId();
 			String expression = cond.getExptressionString();
 			if(id.equals(TACourseNode.ACCESS_TASK))
diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
index dc7edbee0f5..75fb8a6a07e 100644
--- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
@@ -27,11 +27,11 @@ import static org.olat.restapi.security.RestSecurityHelper.isAuthor;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DefaultValue;
-import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
@@ -51,25 +51,31 @@ import org.olat.basesecurity.Constants;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.control.Controller;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.olat.core.util.CodeHelper;
-import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
-import org.olat.core.util.WebappHelper;
 import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
+import org.olat.course.Structure;
 import org.olat.course.config.CourseConfig;
 import org.olat.course.nodes.CourseNode;
+import org.olat.course.repository.ImportGlossaryReferencesController;
+import org.olat.course.repository.ImportPortfolioReferencesController;
+import org.olat.course.repository.ImportReferencesController;
+import org.olat.course.repository.ImportSharedfolderReferencesController;
 import org.olat.course.tree.CourseEditorTreeNode;
+import org.olat.modules.glossary.GlossaryManager;
+import org.olat.modules.sharedfolder.SharedFolderManager;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryImportExport;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.SearchRepositoryEntryParameters;
 import org.olat.repository.handlers.RepositoryHandler;
@@ -77,6 +83,7 @@ import org.olat.repository.handlers.RepositoryHandlerFactory;
 import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
 import org.olat.restapi.security.RestSecurityHelper;
+import org.olat.restapi.support.ErrorWindowControl;
 import org.olat.restapi.support.MediaTypeVariants;
 import org.olat.restapi.support.MultipartReader;
 import org.olat.restapi.support.ObjectFactory;
@@ -226,8 +233,8 @@ public class CoursesWebService {
 		if(!isAuthor(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
-		
-		Identity identity = RestSecurityHelper.getUserRequest(request).getIdentity();
+		UserRequest ureq = RestSecurityHelper.getUserRequest(request);
+		Identity identity = ureq.getIdentity();
 		
 		File tmpFile = null;
 		try {
@@ -238,8 +245,8 @@ public class CoursesWebService {
 				Long accessRaw = partsReader.getLongValue("access");
 				int access = accessRaw != null ? accessRaw.intValue() : RepositoryEntry.ACC_OWNERS;
 				String softKey = partsReader.getValue("softkey");
-				
-				ICourse course = importCourse(identity, tmpFile, softKey, access);
+				String displayName = partsReader.getValue("displayname");
+				ICourse course = importCourse(ureq, identity, tmpFile, displayName, softKey, access);
 				CourseVO vo = ObjectFactory.get(course);
 				return Response.ok(vo).build();
 			}
@@ -256,12 +263,114 @@ public class CoursesWebService {
 		return Response.ok(vo).build();
 	}
 	
-	public static ICourse importCourse(Identity identity, File fCourseImportZIP, String softKey, int access) {
-		RepositoryEntry re = CourseFactory.deployCourseFromZIP(fCourseImportZIP, identity.getName(), softKey, access);
-		ICourse course = CourseFactory.loadCourse(re.getOlatResource());
+	public static ICourse importCourse(UserRequest ureq, Identity identity, File fCourseImportZIP,
+			String displayName, String softKey, int access) {
+		
+		OLATResource newCourseResource = OLATResourceManager.getInstance().createOLATResourceInstance(CourseModule.class);
+		ICourse course = CourseFactory.importCourseFromZip(newCourseResource, fCourseImportZIP);
+		if (course == null) {
+			return null;
+		}
+		
+		if(!StringHelper.containsNonWhitespace(displayName)) {
+			RepositoryEntryImportExport importExport = new RepositoryEntryImportExport(course.getCourseExportDataDir().getBasefile());
+			displayName = importExport.getDisplayName();
+		}
+		if(!StringHelper.containsNonWhitespace(displayName)) {
+			displayName = "import-" + UUID.randomUUID().toString();
+		}
+		
+		// create empty run structure
+		course = CourseFactory.openCourseEditSession(course.getResourceableId());
+		Structure runStructure = course.getRunStructure();
+		runStructure.getRootNode().removeAllChildren();
+		CourseFactory.saveCourse(course.getResourceableId());
+		
+		//import all references
+		List<CourseEditorTreeNode> nodeList = new ArrayList<CourseEditorTreeNode>();
+		collectNodesAsList((CourseEditorTreeNode)course.getEditorTreeModel().getRootNode(), nodeList);
+		processNodeList(ureq, course, nodeList);
+		
+		CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig();
+		if (courseConfig.hasCustomSharedFolder()) {
+			processSharedFolder(ureq, course);
+		} 
+		else if (courseConfig.hasGlossary()) {
+			processGlossary(ureq, course);
+		}
+
+		//make the repository
+		RepositoryEntry re = createCourseRepositoryEntry(identity, displayName, softKey, newCourseResource);
+		prepareSecurityGroup(identity, re, access);
+		
+		//update tree
+		course.getRunStructure().getRootNode().setShortTitle(Formatter.truncateOnly(course.getCourseTitle(), 25)); //do not use truncate!
+		course.getRunStructure().getRootNode().setLongTitle(displayName);
+		CourseEditorTreeNode editorRootNode = ((CourseEditorTreeNode)course.getEditorTreeModel().getRootNode());
+		editorRootNode.getCourseNode().setShortTitle(Formatter.truncateOnly(course.getCourseTitle(), 25)); //do not use truncate!
+		editorRootNode.getCourseNode().setLongTitle(course.getCourseTitle());
+		// mark entire structure as dirty/new so the user can re-publish
+		markDirtyNewRecursively(editorRootNode);
+		// root has already been created during export. Unmark it.
+		editorRootNode.setNewnode(false);
+		
+		CourseFactory.closeCourseEditSession(course.getResourceableId(), false);
+		
+		//publish
+		CourseFactory.publishCourse(course, identity, ureq.getLocale());
+
 		return course;
 	}
 	
+	private static void processSharedFolder(UserRequest ureq, ICourse course) {
+		// if shared folder controller exists we did already import this one.
+		RepositoryEntryImportExport sfImportExport
+			= SharedFolderManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile());
+		ImportSharedfolderReferencesController.doImport(sfImportExport, course, false, ureq.getIdentity());
+	}
+
+	private static void processGlossary(UserRequest ureq, ICourse course) {
+		// if glossary controller exists we did already import this one.
+		RepositoryEntryImportExport sfImportExport
+			= GlossaryManager.getInstance().getRepositoryImportExport(course.getCourseExportDataDir().getBasefile());
+		ImportGlossaryReferencesController.doImport(sfImportExport, course, false, ureq.getIdentity());
+	}
+	
+	/**
+	 * Mark whole tree (incl. root node) "dirty" and "new" recursively.
+	 * 
+	 * @param editorRootNode
+	 */
+	private static void markDirtyNewRecursively(CourseEditorTreeNode editorRootNode) {
+		editorRootNode.setDirty(true);
+		editorRootNode.setNewnode(true);
+		if (editorRootNode.getChildCount() > 0) {
+			for (int i = 0; i < editorRootNode.getChildCount(); i++) {
+				markDirtyNewRecursively((CourseEditorTreeNode)editorRootNode.getChildAt(i));
+			}
+		}
+	}
+	
+	private static void collectNodesAsList(CourseEditorTreeNode rootNode, List<CourseEditorTreeNode> nl) {
+		nl.add(rootNode);
+		for (int i = 0; i < rootNode.getChildCount(); i++) {
+			collectNodesAsList((CourseEditorTreeNode)rootNode.getChildAt(i), nl);
+		}
+	}
+	
+	private static void processNodeList(UserRequest ureq, ICourse course, List<CourseEditorTreeNode> nodeList) {
+		for (CourseEditorTreeNode nextNode : nodeList) {
+			Controller ctrl = nextNode.getCourseNode().importNode(course.getCourseExportDataDir().getBasefile(), course, false, ureq, new ErrorWindowControl());
+			if (ctrl != null) {
+				if (ctrl instanceof ImportReferencesController) {
+					((ImportReferencesController) ctrl).importWithoutAsking (ureq);
+				} else if (ctrl instanceof ImportPortfolioReferencesController) {
+					((ImportPortfolioReferencesController) ctrl).importWithoutAsking (ureq);
+				}
+			}
+		}
+	}
+	
 	public static ICourse copyCourse(Long copyFrom, UserRequest ureq, String name, String longTitle, CourseConfigVO courseConfigVO) {
 		String shortTitle = name;
 		//String learningObjectives = name + " (Example of creating a new course)";
@@ -300,7 +409,7 @@ public class CoursesWebService {
 			OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(newResourceable);
 			preparedEntry.setOlatResource(ores);
 			// create security group
-			prepareSecurityGroup(ureq.getIdentity(), preparedEntry);
+			prepareSecurityGroup(ureq.getIdentity(), preparedEntry, RepositoryEntry.ACC_OWNERS);
 			// copy image if available
 			RepositoryManager.getInstance().copyImage(src, preparedEntry);
 			
@@ -324,35 +433,43 @@ public class CoursesWebService {
 		String learningObjectives = shortTitle + " (Example of creating a new course)";
 
 		try {
-			// create the course resource
 			OLATResourceable oresable = OLATResourceManager.getInstance().createOLATResourceInstance(CourseModule.class);
-
 			// create a repository entry
-			RepositoryEntry addedEntry = RepositoryManager.getInstance().createRepositoryEntryInstance(initialAuthor.getName());
-			addedEntry.setCanDownload(false);
-			addedEntry.setCanLaunch(true);
-			addedEntry.setDisplayname(shortTitle);
-			addedEntry.setResourcename("-");
-			// Do set access for owner at the end, because unfinished course should be
-			// invisible
-			// addedEntry.setAccess(RepositoryEntry.ACC_OWNERS);
-			addedEntry.setAccess(0);// Access for nobody
-
-			// Set the resource on the repository entry and save the entry.
-			// bind resource and repository entry
-			OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(oresable);
-			addedEntry.setOlatResource(ores);
-
+			RepositoryEntry addedEntry = createCourseRepositoryEntry(initialAuthor, shortTitle, null, oresable);
 			// create an empty course
 			CourseFactory.createEmptyCourse(oresable, shortTitle, longTitle, learningObjectives);
-			prepareSecurityGroup(initialAuthor, addedEntry);
+			prepareSecurityGroup(initialAuthor, addedEntry, RepositoryEntry.ACC_OWNERS);
 			return prepareCourse(addedEntry, courseConfigVO);
 		} catch (Exception e) {
 			throw new WebApplicationException(e);
 		}
 	}
 	
-	private static void prepareSecurityGroup(Identity identity, RepositoryEntry addedEntry) {
+	private static RepositoryEntry createCourseRepositoryEntry(Identity initialAuthor, String shortTitle, 
+			String softKey, OLATResourceable oresable) {
+		// create a repository entry
+		RepositoryEntry addedEntry = RepositoryManager.getInstance().createRepositoryEntryInstance(initialAuthor.getName());
+		addedEntry.setCanDownload(false);
+		addedEntry.setCanLaunch(true);
+		addedEntry.setDisplayname(shortTitle);
+		addedEntry.setResourcename("-");
+		if(StringHelper.containsNonWhitespace(softKey) && softKey.length() <= 30) {
+			addedEntry.setSoftkey(softKey);
+		}
+		// Do set access for owner at the end, because unfinished course should be
+		// invisible
+		// addedEntry.setAccess(RepositoryEntry.ACC_OWNERS);
+		addedEntry.setAccess(0);// Access for nobody
+
+		// Set the resource on the repository entry and save the entry.
+		// bind resource and repository entry
+		OLATResource ores = OLATResourceManager.getInstance().findOrPersistResourceable(oresable);
+		addedEntry.setOlatResource(ores);
+		
+		return addedEntry;//!!!no update at this point
+	}
+	
+	private static void prepareSecurityGroup(Identity identity, RepositoryEntry addedEntry, int access) {
 		// create security group
 		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		SecurityGroup newGroup = securityManager.createAndPersistSecurityGroup();
@@ -381,7 +498,7 @@ public class CoursesWebService {
 		securityManager.createAndPersistPolicy(participantGroup, Constants.PERMISSION_HASROLE, Constants.ORESOURCE_PARTICIPANT);
 		addedEntry.setParticipantGroup(participantGroup);
 		// Do set access for owner at the end, because unfinished course should be invisible
-		addedEntry.setAccess(RepositoryEntry.ACC_OWNERS);
+		addedEntry.setAccess(access);
 		RepositoryManager.getInstance().saveRepositoryEntry(addedEntry);
 	}
 	
diff --git a/src/test/java/org/olat/restapi/Course_with_blog.zip b/src/test/java/org/olat/restapi/Course_with_blog.zip
new file mode 100644
index 0000000000000000000000000000000000000000..62ec56d7e6f1321396de9cc7e58a1a2969ca585e
GIT binary patch
literal 20281
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
M!2V_WMhNBq03+UB4FCWD

literal 0
HcmV?d00001

diff --git a/src/test/java/org/olat/restapi/CoursesTest.java b/src/test/java/org/olat/restapi/CoursesTest.java
index 69e7e282441..01e1a16197e 100644
--- a/src/test/java/org/olat/restapi/CoursesTest.java
+++ b/src/test/java/org/olat/restapi/CoursesTest.java
@@ -174,7 +174,7 @@ public class CoursesTest extends OlatJerseyTestCase {
 	
 	@Test
 	public void testImportCourse() throws IOException, URISyntaxException {
-		URL cpUrl = CoursesTest.class.getResource("Very_small_course.zip");
+		URL cpUrl = CoursesTest.class.getResource("Course_with_blog.zip");
 		assertNotNull(cpUrl);
 		File cp = new File(cpUrl.toURI());
 
-- 
GitLab