diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java index 91ce41db3935075d7121d0b2ee2be3dc0ccc6f1d..1ecc6c05430b76b29370a62144daeb32b83b716f 100644 --- a/src/main/java/org/olat/course/CourseFactory.java +++ b/src/main/java/org/olat/course/CourseFactory.java @@ -522,22 +522,23 @@ public class CourseFactory extends BasicManager { * @param fTargetZIP * @return true if successfully exported, false otherwise. */ - public static void exportCourseToZIP(OLATResourceable sourceRes, File fTargetZIP, boolean backwardsCompatible) { + public static void exportCourseToZIP(OLATResourceable sourceRes, File fTargetZIP, boolean runtimeDatas, boolean backwardsCompatible) { PersistingCourseImpl sourceCourse = (PersistingCourseImpl) loadCourse(sourceRes); // add files to ZIP File fExportDir = new File(WebappHelper.getTmpDir(), CodeHelper.getUniqueID()); fExportDir.mkdirs(); + log.info("Export folder: " + fExportDir); synchronized (sourceCourse) { //o_clusterNOK - cannot be solved with doInSync since could take too long (leads to error: "Lock wait timeout exceeded") OLATResource courseResource = sourceCourse.getCourseEnvironment().getCourseGroupManager().getCourseResource(); - sourceCourse.exportToFilesystem(courseResource, fExportDir, backwardsCompatible); - Codepoint.codepoint(CourseFactory.class, "longExportCourseToZIP"); + sourceCourse.exportToFilesystem(courseResource, fExportDir, runtimeDatas, backwardsCompatible); Set<String> fileSet = new HashSet<String>(); String[] files = fExportDir.list(); for (int i = 0; i < files.length; i++) { fileSet.add(files[i]); } ZipUtil.zip(fileSet, fExportDir, fTargetZIP, false); + log.info("Delete export folder: " + fExportDir); FileUtils.deleteDirsAndFiles(fExportDir, true, true); } } @@ -1176,9 +1177,9 @@ public class CourseFactory extends BasicManager { int numOfChildren = node.getChildCount(); for (int i = 0; i < numOfChildren; i++) { INode child = node.getChildAt(i); - if (child instanceof TreeNode) { + if (child instanceof TreeNode && publishTreeModel.isVisible(child)) { nodeToPublish.add(child.getIdent()); - visitPublishModel((TreeNode) child, publishTreeModel, nodeToPublish); + visitPublishModel((TreeNode)child, publishTreeModel, nodeToPublish); } } } diff --git a/src/main/java/org/olat/course/ICourse.java b/src/main/java/org/olat/course/ICourse.java index 2be794bc4e101f0258726f2f385bdec4b3b313bb..bb0e53b718dcd2dacae0ada27cd3157b5ba0cbce 100644 --- a/src/main/java/org/olat/course/ICourse.java +++ b/src/main/java/org/olat/course/ICourse.java @@ -63,9 +63,14 @@ public interface ICourse extends OLATResourceable { /** * Export course to file system. - * @param exportDirecotry The directory to export files to. + * @param originalCourseResource The original resource + * @param exportDirectory The directory to export files to. + * @param runtimeDatas Export with runtime datas (true add archives of the groups...) + * @param backwardsCompatible Export in a format compatible with older OpenOLAT version + * @param foldersToCleanup Can add there folders which need to be clean up after the export */ - public void exportToFilesystem(OLATResource originalCourseResource, File exportDirecotry, boolean backwardsCompatible); + public void exportToFilesystem(OLATResource originalCourseResource, File exportDirectory, + boolean runtimeDatas, boolean backwardsCompatible); public void postImport(CourseEnvironmentMapper envMapper); diff --git a/src/main/java/org/olat/course/PersistingCourseImpl.java b/src/main/java/org/olat/course/PersistingCourseImpl.java index 3a6cf370e7a2f7ddf547e5d346735508222cc0bb..253946a3aad90dd2b38212cb93574a5c7f0494a1 100644 --- a/src/main/java/org/olat/course/PersistingCourseImpl.java +++ b/src/main/java/org/olat/course/PersistingCourseImpl.java @@ -243,7 +243,9 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ * See OLAT-5368: Course Export can take longer than say 2min. * <p> */ - public void exportToFilesystem(OLATResource originalCourseResource, File exportDirectory, boolean backwardsCompatible) { + @Override + public void exportToFilesystem(OLATResource originalCourseResource, File exportDirectory, + boolean runtimeDatas, boolean backwardsCompatible) { long s = System.currentTimeMillis(); log.info("exportToFilesystem: exporting course "+this+" to "+exportDirectory+"..."); File fCourseBase = getCourseBaseContainer().getBasefile(); @@ -260,7 +262,7 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ //prevents duplicate names envMapper.avoidDuplicateNames(); } - PersistingCourseGroupManager.getInstance(this).exportCourseBusinessGroups(fExportedDataDir, envMapper, backwardsCompatible); + PersistingCourseGroupManager.getInstance(this).exportCourseBusinessGroups(fExportedDataDir, envMapper, runtimeDatas, backwardsCompatible); if(backwardsCompatible) { XStream xstream = CourseXStreamAliases.getReadCourseXStream(); diff --git a/src/main/java/org/olat/course/condition/AreaSelectionController.java b/src/main/java/org/olat/course/condition/AreaSelectionController.java index 62af84a49923a7a9376ffdc8c99b6c9bb48648e4..8c52828e3c22035ec2909bc65b3fe03b970c6a8b 100644 --- a/src/main/java/org/olat/course/condition/AreaSelectionController.java +++ b/src/main/java/org/olat/course/condition/AreaSelectionController.java @@ -62,15 +62,16 @@ public class AreaSelectionController extends FormBasicController { private final CourseGroupManager courseGrpMngr; private NewAreaController areaCreateCntrllr; private CloseableModalController cmc; - + private final boolean createEnable; private String[] areaNames; private String[] areaKeys; public AreaSelectionController(UserRequest ureq, WindowControl wControl, String title, - CourseGroupManager courseGrpMngr, List<Long> selectionKeys) { + boolean allowCreate, CourseGroupManager courseGrpMngr, List<Long> selectionKeys) { super(ureq, wControl, "group_or_area_selection"); this.courseGrpMngr = courseGrpMngr; + this.createEnable = allowCreate; loadNamesAndKeys(); initForm(ureq); @@ -128,14 +129,17 @@ public class AreaSelectionController extends FormBasicController { @Override protected void initForm(FormItemContainer boundTo, Controller listener, UserRequest ureq) { - // easy creation only possible if a default group context available - createNew = new FormLinkImpl("create"); - //is a button - createNew.setCustomEnabledLinkCSS("b_button"); - createNew.setCustomDisabledLinkCSS("b_button b_disabled"); - // create new group/area on the right side - boundTo.add(createNew); + if(createEnable) { + // easy creation only possible if a default group context available + createNew = new FormLinkImpl("create"); + //is a button + createNew.setCustomEnabledLinkCSS("b_button"); + createNew.setCustomDisabledLinkCSS("b_button b_disabled"); + // create new group/area on the right side + boundTo.add(createNew); + } + entrySelector = uifactory.addCheckboxesVertical("entries", null, boundTo, areaKeys, areaNames, null, 1); // submitCancel after checkboxes // diff --git a/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java b/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java index b4a55a1167f1c14494389605a2230222d6be5788..51d35da8fb0ddf8031e47bc2427661c733551556 100644 --- a/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java +++ b/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java @@ -331,7 +331,7 @@ public class ConditionConfigEasyController extends FormBasicController implement removeAsListenerAndDispose(groupChooseC); List<Long> groupKeys = getKeys(easyGroupList); - groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", + groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", true, courseEditorEnv.getCourseGroupManager(), groupKeys); listenTo(groupChooseC); @@ -355,7 +355,7 @@ public class ConditionConfigEasyController extends FormBasicController implement removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(areaChooseC); - areaChooseC = new AreaSelectionController(ureq, getWindowControl(), "area", + areaChooseC = new AreaSelectionController(ureq, getWindowControl(), "area", true, courseEditorEnv.getCourseGroupManager(), getKeys(easyAreaList)); listenTo(areaChooseC); diff --git a/src/main/java/org/olat/course/condition/GroupSelectionController.java b/src/main/java/org/olat/course/condition/GroupSelectionController.java index d157d6a1215462be4f6f36c3ca5836c12a289357..70ade8464da93d5c97d649cb022065073a51609c 100644 --- a/src/main/java/org/olat/course/condition/GroupSelectionController.java +++ b/src/main/java/org/olat/course/condition/GroupSelectionController.java @@ -69,12 +69,12 @@ public class GroupSelectionController extends FormBasicController { private boolean createEnable; public GroupSelectionController(UserRequest ureq, WindowControl wControl, String title, - CourseGroupManager courseGrpMngr, List<Long> selectionKeys) { + boolean allowCreate, CourseGroupManager courseGrpMngr, List<Long> selectionKeys) { super(ureq, wControl, "group_or_area_selection"); this.courseGrpMngr = courseGrpMngr; RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(courseGrpMngr.getCourseResource(), false); - createEnable = !RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups); + createEnable = allowCreate && !RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups); // unique names from list to array loadNamesAndKeys(); initForm(ureq); diff --git a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java index ac6a05bc51f2906a9d68fc28a49271fc9c069303..99041d1780e76769898ea34c9792adba8601ebf8 100644 --- a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java +++ b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java @@ -191,7 +191,8 @@ public interface CourseGroupManager { * * @param fExportDirectory */ - public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env, boolean backwardsCompatible); + public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env, + boolean runtimeDatas, boolean backwardsCompatible); /** * Import course internal groups fa previous export. diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java index 16f84d6ccbdff68292417b550fb80d9a0ca8562f..b7396c45ee2ca47f67c8a2b50db4857989b9fdb3 100644 --- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java +++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java @@ -320,7 +320,8 @@ public class PersistingCourseGroupManager extends BasicManager implements Course * @see org.olat.course.groupsandrights.CourseGroupManager#exportCourseBusinessGroups(java.io.File) */ @Override - public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper courseEnv, boolean backwardsCompatible) { + public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper courseEnv, + boolean runtimeDatas, boolean backwardsCompatible) { File fExportFile = new File(fExportDirectory, LEARNINGGROUPEXPORT_XML); List<BGArea> areas = getAllAreas(); List<BusinessGroup> groups = getAllBusinessGroups(); @@ -328,7 +329,7 @@ public class PersistingCourseGroupManager extends BasicManager implements Course BusinessGroupEnvironment bgEnv = new BusinessGroupEnvironment(); bgEnv.getGroups().addAll(courseEnv.getGroups()); bgEnv.getAreas().addAll(courseEnv.getAreas()); - businessGroupService.exportGroups(groups, areas, fExportFile, bgEnv, backwardsCompatible); + businessGroupService.exportGroups(groups, areas, fExportFile, bgEnv, runtimeDatas, backwardsCompatible); } /** diff --git a/src/main/java/org/olat/course/nodes/co/COConfigForm.java b/src/main/java/org/olat/course/nodes/co/COConfigForm.java index ed595657dee871547fb1143b33dd86d50beff4ac..50a2e368a4a730b851371e28c0c5477592056709 100644 --- a/src/main/java/org/olat/course/nodes/co/COConfigForm.java +++ b/src/main/java/org/olat/course/nodes/co/COConfigForm.java @@ -577,7 +577,7 @@ public class COConfigForm extends FormBasicController { removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(groupChooseC); - groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", + groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", true, cev.getCourseGroupManager(), getKeys(easyGroupList)); listenTo(groupChooseC); @@ -603,7 +603,7 @@ public class COConfigForm extends FormBasicController { removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(areaChooseC); - areaChooseC = new AreaSelectionController (ureq, getWindowControl(), "area", + areaChooseC = new AreaSelectionController (ureq, getWindowControl(), "area", true, cev.getCourseGroupManager(), getKeys(easyAreaList)); listenTo(areaChooseC); diff --git a/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java b/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java index 7edb815089249b265c525a04b5d2e4a6e132fdab..08d1b5e70d9d58473f896fc97315701e238be3dd 100644 --- a/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java +++ b/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java @@ -395,7 +395,7 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == chooseGroupsLink) { removeAsListenerAndDispose(groupChooseC); - groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", + groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", true, cev.getCourseGroupManager(), getKeys(easyGroupList)); listenTo(groupChooseC); @@ -428,7 +428,7 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener removeAsListenerAndDispose(areaChooseC); // already areas -> choose areas - areaChooseC = new AreaSelectionController (ureq, getWindowControl() , "area", + areaChooseC = new AreaSelectionController (ureq, getWindowControl() , "area", true, cev.getCourseGroupManager(), getKeys(easyAreaList)); listenTo(areaChooseC); diff --git a/src/main/java/org/olat/course/repository/CreateNewCourseController.java b/src/main/java/org/olat/course/repository/CreateNewCourseController.java index 012ce472cf88f5051dda738dc1841d384cf62e90..8c4c80fa9df1e581aa7e57fc082c14439b944d39 100644 --- a/src/main/java/org/olat/course/repository/CreateNewCourseController.java +++ b/src/main/java/org/olat/course/repository/CreateNewCourseController.java @@ -166,7 +166,7 @@ public class CreateNewCourseController extends BasicController implements IAddCo File fExportDir = new File(WebappHelper.getTmpDir(), UUID.randomUUID().toString()); fExportDir.mkdirs(); - sourceCgm.exportCourseBusinessGroups(fExportDir, env, false); + sourceCgm.exportCourseBusinessGroups(fExportDir, env, false, false); course = CourseFactory.loadCourse(newEntry.getOlatResource().getResourceableId()); CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager(); diff --git a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java index 028e3d8d6cb3e9d34dd9eb7fb82fa1cc556d0b2d..d7f6f756cec0cc6273df26be9223573b9559d097 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java +++ b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java @@ -276,7 +276,8 @@ final class PreviewCourseGroupManager extends BasicManager implements CourseGrou } @Override - public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env, boolean backwardsCompatible) { + public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env, + boolean runtimeDatas, boolean backwardsCompatible) { throw new AssertException("unsupported"); } diff --git a/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java b/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java index 555c59aed5388ecfe72abaf06f10a61ca520a1c5..b04b357351bd13925afc4020892ad1558ed600f3 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java +++ b/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java @@ -201,7 +201,7 @@ public class PreviewSettingsForm extends FormBasicController { removeAsListenerAndDispose(cmc); removeAsListenerAndDispose (groupChooser); - groupChooser = new GroupSelectionController(ureq, getWindowControl(), "group", courseGroupManager, getKeys(group)); + groupChooser = new GroupSelectionController(ureq, getWindowControl(), "group", false, courseGroupManager, getKeys(group)); listenTo(groupChooser); cmc = new CloseableModalController(getWindowControl(), translate("close"), groupChooser.getInitialComponent()); listenTo(cmc); @@ -210,7 +210,7 @@ public class PreviewSettingsForm extends FormBasicController { removeAsListenerAndDispose(cmc); removeAsListenerAndDispose (areaChooser); - areaChooser = new AreaSelectionController(ureq, getWindowControl(), "area", courseGroupManager, getKeys(area)); + areaChooser = new AreaSelectionController(ureq, getWindowControl(), "area", false, courseGroupManager, getKeys(area)); listenTo(areaChooser); cmc = new CloseableModalController(getWindowControl(), translate("close"), areaChooser.getInitialComponent()); listenTo(cmc); @@ -221,15 +221,33 @@ public class PreviewSettingsForm extends FormBasicController { @Override protected void event(UserRequest ureq, Controller source, Event event) { if (source == groupChooser) { + if(Event.DONE_EVENT == event) { + group.setValue(StringHelper.formatAsCSVString(groupChooser.getSelectedNames())); + group.setUserObject(groupChooser.getSelectedKeys()); + } cmc.deactivate(); - group.setValue(StringHelper.formatAsCSVString(groupChooser.getSelectedNames())); - group.setUserObject(groupChooser.getSelectedKeys()); + cleanUp(); } else if (source == areaChooser) { + if(Event.DONE_EVENT == event) { + area.setValue(StringHelper.formatAsCSVString(areaChooser.getSelectedNames())); + area.setUserObject(areaChooser.getSelectedKeys()); + } cmc.deactivate(); - area.setValue(StringHelper.formatAsCSVString(areaChooser.getSelectedNames())); - area.setUserObject(areaChooser.getSelectedKeys()); + cleanUp(); + } else if(source == cmc) { + cleanUp(); } } + + private void cleanUp() { + removeAsListenerAndDispose(cmc); + removeAsListenerAndDispose(groupChooser); + removeAsListenerAndDispose(areaChooser); + cmc = null; + groupChooser = null; + areaChooser = null; + } + @Override protected void doDispose() { // diff --git a/src/main/java/org/olat/group/BusinessGroupService.java b/src/main/java/org/olat/group/BusinessGroupService.java index 3575fb9e7ef1c2ac536fbdfc8c4d536d129139f4..1ebd023389fb05ef212ab753a63acfe309728c66 100644 --- a/src/main/java/org/olat/group/BusinessGroupService.java +++ b/src/main/java/org/olat/group/BusinessGroupService.java @@ -548,7 +548,8 @@ public interface BusinessGroupService { * @param groups * @param fExportFile */ - public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, BusinessGroupEnvironment env, boolean backwardsCompatible); + public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, BusinessGroupEnvironment env, + boolean runtimeDatas, boolean backwardsCompatible); /** * Import previously exported group definitions. diff --git a/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java b/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java index 39d53ff3ab725a1f76bb661f8e3dec6924fd87b0..d8edbc957648ab2db7ee7f7e8a13e148f9899992 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java @@ -75,7 +75,8 @@ public class BusinessGroupImportExport { private BusinessGroupModule groupModule; - public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, BusinessGroupEnvironment env, boolean backwardsCompatible) { + public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, + BusinessGroupEnvironment env, boolean runtimeDatas, boolean backwardsCompatible) { if (groups == null || groups.isEmpty()) { return; // nothing to do... says Florian. } @@ -106,22 +107,14 @@ public class BusinessGroupImportExport { if(backwardsCompatible && env != null) { groupName = env.getGroupName(group.getKey()); } - Group newGroup = exportGroup(fExportFile, group, groupName, backwardsCompatible); + Group newGroup = exportGroup(fExportFile, group, groupName, runtimeDatas, backwardsCompatible); root.getGroups().getGroups().add(newGroup); } saveGroupConfiguration(fExportFile, root); } - public void exportGroup(BusinessGroup group, File fExportFile, boolean backwardsCompatible) { - OLATGroupExport root = new OLATGroupExport(); - Group newGroup = exportGroup(fExportFile, group, null, backwardsCompatible); - root.setGroups(new GroupCollection()); - root.getGroups().setGroups(new ArrayList<Group>()); - root.getGroups().getGroups().add(newGroup); - saveGroupConfiguration(fExportFile, root); - } - - private Group exportGroup(File fExportFile, BusinessGroup group, String groupName, boolean backwardsCompatible) { + private Group exportGroup(File fExportFile, BusinessGroup group, String groupName, + boolean runtimeDatas, boolean backwardsCompatible) { Group newGroup = new Group(); newGroup.key = backwardsCompatible ? null : group.getKey(); newGroup.name = StringHelper.containsNonWhitespace(groupName) ? groupName : group.getName(); @@ -169,7 +162,9 @@ public class BusinessGroupImportExport { } log.debug("fExportFile.getParent()=" + fExportFile.getParent()); - ct.archive(fExportFile.getParent()); + if(runtimeDatas) { + ct.archive(fExportFile.getParent()); + } // export membership List<BGArea> bgAreas = areaManager.findBGAreasOfBusinessGroup(group); newGroup.areaRelations = new ArrayList<String>(); diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java index cbf66ec9ac8824bfaf15e59a21bc1b1e4542b6e1..16c05a2852bfe8a4ab2ab340536e65304674db32 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java @@ -1715,8 +1715,8 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD @Override public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, - BusinessGroupEnvironment env, boolean backwardsCompatible) { - businessGroupImportExport.exportGroups(groups, areas, fExportFile, env, backwardsCompatible); + BusinessGroupEnvironment env, boolean runtimeDatas, boolean backwardsCompatible) { + businessGroupImportExport.exportGroups(groups, areas, fExportFile, env, runtimeDatas, backwardsCompatible); } @Override diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java index 37dbeda54c494bec9ddd11947af93452cbb85977..f80f8e911ed935061cd8bb8c00c6dce16be8f3d4 100644 --- a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java +++ b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java @@ -336,9 +336,8 @@ public class QuestionItemDAO { public int countFavoritItems(SearchQuestionItemParams params) { StringBuilder sb = new StringBuilder(); - sb.append("select count(item) from questionitem item") - .append(" where item.markCreatorKey=:identityKey") - .append(" )"); + sb.append("select count(item) from qitemview item") + .append(" where item.markCreatorKey=:identityKey"); if(StringHelper.containsNonWhitespace(params.getFormat())) { sb.append(" and item.format=:format"); } diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java index c2f8ea6b615d7696a6b78e40eed661fb73975d1b..259f368201e51a1341171dc153f33a9b4340ce32 100644 --- a/src/main/java/org/olat/repository/handlers/CourseHandler.java +++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java @@ -156,7 +156,7 @@ public class CourseHandler implements RepositoryHandler { RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(res, true); String exportFileName = StringHelper.transformDisplayNameToFileSystemName(re.getDisplayname()) + ".zip"; File fExportZIP = new File(WebappHelper.getTmpDir(), exportFileName); - CourseFactory.exportCourseToZIP(res, fExportZIP, backwardsCompatible); + CourseFactory.exportCourseToZIP(res, fExportZIP, false, backwardsCompatible); return new CleanupAfterDeliveryFileMediaResource(fExportZIP); } @@ -273,7 +273,7 @@ public class CourseHandler implements RepositoryHandler { // Archive course run structure (like course export) String courseExportFileName = "course_export.zip"; File courseExportZIP = new File(tmpExportDir, courseExportFileName); - CourseFactory.exportCourseToZIP(entry.getOlatResource(), courseExportZIP, false); + CourseFactory.exportCourseToZIP(entry.getOlatResource(), courseExportZIP, true, false); // Zip runtime data and course run structure data into one zip-file String completeArchiveFileName = "del_course_" + entry.getOlatResource().getResourceableId() + ".zip"; String completeArchivePath = archivFilePath + File.separator + completeArchiveFileName; diff --git a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java index 2e6597629d0db15feacfbdfb05f4069d2cbe22c9..b29de9a9c4e1dec7e9f1c4898f54c858fe1a13f3 100644 --- a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java @@ -33,6 +33,7 @@ import javax.servlet.http.HttpServletRequest; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import org.olat.core.gui.components.tree.TreeNode; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; @@ -205,6 +206,7 @@ public abstract class AbstractCourseNodeWebService { ICourse course = editSession.getCourse(); + TreeNode updateEditorNode = course.getEditorTreeModel().getNodeById(nodeId); CourseNode updatedNode = course.getEditorTreeModel().getCourseNode(nodeId); if(StringHelper.containsNonWhitespace(shortTitle)) { updatedNode.setShortTitle(shortTitle); @@ -230,7 +232,7 @@ public abstract class AbstractCourseNodeWebService { ModuleConfiguration moduleConfig = updatedNode.getModuleConfiguration(); delegateConfig.configure(course, updatedNode, moduleConfig); } - course.getEditorTreeModel().nodeConfigChanged(updatedNode); + course.getEditorTreeModel().nodeConfigChanged(updateEditorNode); CourseEditorTreeNode editorNode = course.getEditorTreeModel().getCourseEditorNodeContaining(updatedNode); CourseNodeVO vo = get(updatedNode); vo.setParentId(editorNode.getParent() == null ? null: editorNode.getParent().getIdent()); diff --git a/src/test/java/org/olat/restapi/CoursePublishTest.java b/src/test/java/org/olat/restapi/CoursePublishTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1900aab04ddf717048536e19c54cfb0832d69b00 --- /dev/null +++ b/src/test/java/org/olat/restapi/CoursePublishTest.java @@ -0,0 +1,128 @@ +/** + * <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.restapi; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.UUID; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; + +import junit.framework.Assert; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.util.EntityUtils; +import org.junit.Test; +import org.olat.core.commons.persistence.DB; +import org.olat.course.CourseFactory; +import org.olat.course.ICourse; +import org.olat.course.nodes.CourseNode; +import org.olat.repository.RepositoryEntry; +import org.olat.restapi.support.vo.CourseVO; +import org.olat.test.OlatJerseyTestCase; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Test the publish process via REST API + * + * Initial date: 06.11.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class CoursePublishTest extends OlatJerseyTestCase { + + @Autowired + private DB dbInstance; + + @Test + public void testGetCourse() throws IOException, URISyntaxException { + RestConnection conn = new RestConnection(); + assertTrue(conn.login("administrator", "openolat")); + + //deploy a test course + URL courseWithForumsUrl = CoursePublishTest.class.getResource("myCourseWS.zip"); + Assert.assertNotNull(courseWithForumsUrl); + File courseWithForums = new File(courseWithForumsUrl.toURI()); + String softKey = UUID.randomUUID().toString().replace("-", "").substring(0, 30); + RepositoryEntry re = CourseFactory.deployCourseFromZIP(courseWithForums, "administrator", softKey, 4); + Assert.assertNotNull(re); + ICourse course = CourseFactory.loadCourse(re.getOlatResource().getResourceableId()); + CourseNode rootNode = course.getRunStructure().getRootNode(); + Assert.assertEquals(2, rootNode.getChildCount()); + + dbInstance.commitAndCloseSession(); + + //get the course + URI uri = conn.getContextURI().path("repo").path("courses").path(course.getResourceableId().toString()).build(); + HttpGet method = conn.createGet(uri, MediaType.APPLICATION_JSON, true); + HttpResponse response = conn.execute(method); + assertEquals(200, response.getStatusLine().getStatusCode()); + CourseVO courseVo = conn.parse(response, CourseVO.class); + Assert.assertNotNull(courseVo); + + //update the root node + URI rootUri = getElementsUri(courseVo).path("structure").path(courseVo.getEditorRootNodeId()).build(); + HttpPost updateMethod = conn.createPost(rootUri, MediaType.APPLICATION_JSON); + HttpEntity entity = MultipartEntityBuilder.create() + .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) + .addTextBody("shortTitle", "Change it short") + .addTextBody("longTitle", "Change it long") + .build(); + updateMethod.setEntity(entity); + HttpResponse updateRootResponse = conn.execute(updateMethod); + int updateRootCode = updateRootResponse.getStatusLine().getStatusCode(); + assertTrue(updateRootCode == 200 || updateRootCode == 201); + EntityUtils.consume(updateRootResponse.getEntity()); + + //publish + URI publishUri = getCoursesUri().path(courseVo.getKey().toString()).path("publish").build(); + HttpPost publishMethod = conn.createPost(publishUri, MediaType.APPLICATION_JSON); + HttpResponse publishResponse = conn.execute(publishMethod); + int publishCode = publishResponse.getStatusLine().getStatusCode(); + assertTrue(publishCode == 200 || publishCode == 201); + EntityUtils.consume(publishResponse.getEntity()); + + //reload the course + ICourse reloadedCourse = CourseFactory.loadCourse(re.getOlatResource().getResourceableId()); + CourseNode reloadRootNode = reloadedCourse.getRunStructure().getRootNode(); + Assert.assertEquals(2, reloadRootNode.getChildCount()); + } + + private UriBuilder getCoursesUri() { + return UriBuilder.fromUri(getContextURI()).path("repo").path("courses"); + } + + private UriBuilder getElementsUri(CourseVO course) { + return getCoursesUri().path(course.getKey().toString()).path("elements"); + } + +} \ No newline at end of file diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index 9f17185aae7bbfc21811a6915629727208b62e09..351e1bd695ef5177f97c9f52aac8b577e2f77205 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -177,6 +177,7 @@ import org.junit.runners.Suite; org.olat.restapi.CoursesForumsTest.class, org.olat.restapi.CoursesResourcesFoldersTest.class, org.olat.restapi.CoursesTest.class, + org.olat.restapi.CoursePublishTest.class, org.olat.restapi.CoursesInfosTest.class, org.olat.restapi.CourseTest.class, org.olat.restapi.FolderTest.class,