diff --git a/src/main/java/de/bps/olat/user/ChangeEMailExecuteController.java b/src/main/java/de/bps/olat/user/ChangeEMailExecuteController.java index d362ab8bce66a27619d6a6c08eec3ed917615178..4d7132ee2a91009b98af78a92305caa8d8d3c041 100644 --- a/src/main/java/de/bps/olat/user/ChangeEMailExecuteController.java +++ b/src/main/java/de/bps/olat/user/ChangeEMailExecuteController.java @@ -79,11 +79,11 @@ public class ChangeEMailExecuteController extends ChangeEMailController implemen if (isLinkClicked()) { changeEMail(getWindowControl()); } else { - Boolean alreadySeen = ((Boolean)ureq.getUserSession().getEntry(PRESENTED_EMAIL_CHANGE_REMINDER)); - if (alreadySeen == null) { - getWindowControl().setWarning(getPackageTranslator().translate("email.change.reminder")); - ureq.getUserSession().putEntry(PRESENTED_EMAIL_CHANGE_REMINDER, Boolean.TRUE); - } + Boolean alreadySeen = ((Boolean)ureq.getUserSession().getEntry(PRESENTED_EMAIL_CHANGE_REMINDER)); + if (alreadySeen == null) { + getWindowControl().setWarning(getPackageTranslator().translate("email.change.reminder")); + ureq.getUserSession().putEntry(PRESENTED_EMAIL_CHANGE_REMINDER, Boolean.TRUE); + } } } } else { diff --git a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java index c1d4545bf1b4121e3e1bd6d57ebb643bee58085b..ab6c0c98f1422be5d441b8ea6591b03ce7f2b296 100644 --- a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java +++ b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java @@ -31,7 +31,6 @@ import java.util.Map; import org.olat.NewControllerFactory; import org.olat.basesecurity.BaseSecurityModule; import org.olat.basesecurity.GroupRoles; -import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; @@ -47,6 +46,7 @@ import org.olat.core.gui.components.table.StaticColumnDescriptor; import org.olat.core.gui.components.table.Table; import org.olat.core.gui.components.table.TableController; import org.olat.core.gui.components.table.TableEvent; +import org.olat.core.gui.components.table.TableGuiConfiguration; import org.olat.core.gui.components.table.TableMultiSelectEvent; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; @@ -84,6 +84,7 @@ import org.olat.repository.controllers.RepositoryEntryFilter; import org.olat.repository.controllers.RepositorySearchController.Can; import org.olat.repository.model.RepositoryEntryMembership; import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -92,6 +93,7 @@ import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; * */ public class CourseOverviewController extends BasicController { + private static final String CONFIG = CourseOverviewController.class.getName(); private static final String TABLE_ACTION_LAUNCH = "reTblLaunch"; private static final String TABLE_ACTION_EDIT = "edit"; private static final String TABLE_ACTION_UNSUBSCRIBE = "unsubscribe"; @@ -109,30 +111,38 @@ public class CourseOverviewController extends BasicController { private final Identity editedIdentity; - private final RepositoryModule repositoryModule; - private final RepositoryManager repositoryManager; - private final RepositoryService repositoryService; - private final BusinessGroupService businessGroupService; + @Autowired + private BaseSecurityModule securityModule; + @Autowired + private RepositoryModule repositoryModule; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private RepositoryService repositoryService; + @Autowired + private BusinessGroupService businessGroupService; public CourseOverviewController(UserRequest ureq, WindowControl wControl, Identity identity) { super(ureq, wControl, Util.createPackageTranslator(BusinessGroupTableModelWithType.class, ureq.getLocale())); - - repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class); - repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class); - repositoryService = CoreSpringFactory.getImpl(RepositoryService.class); - businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); - BaseSecurityModule securityModule = CoreSpringFactory.getImpl(BaseSecurityModule.class); + this.setTranslator(Util.createPackageTranslator(RepositoryService.class, getLocale(), getTranslator())); + editedIdentity = identity; - boolean isLastVisitVisible = securityModule.isUserLastVisitVisible(ureq.getUserSession().getRoles()); vc = createVelocityContainer("courseoverview"); + + TableGuiConfiguration config = new TableGuiConfiguration(); + config.setPreferencesOffered(true, CONFIG); - courseListCtr = new TableController(null, ureq, wControl, getTranslator()); + courseListCtr = new TableController(config, ureq, wControl, getTranslator()); listenTo(courseListCtr); courseListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(MSCols.key.i18n(), MSCols.key.ordinal(), null, getLocale())); courseListCtr.addColumnDescriptor(new DefaultColumnDescriptor(MSCols.title.i18n(), MSCols.title.ordinal(), null, getLocale())); + if(repositoryModule.isManagedRepositoryEntries()) { + courseListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(MSCols.externalId.i18n(), MSCols.externalId.ordinal(), null, getLocale())); + } + courseListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(MSCols.externalRef.i18n(), MSCols.externalRef.ordinal(), null, getLocale())); CustomCellRenderer roleRenderer = new CourseRoleCellRenderer(); courseListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(MSCols.role.i18n(), MSCols.role.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer)); courseListCtr.addColumnDescriptor(new DefaultColumnDescriptor(MSCols.firstTime.i18n(), MSCols.firstTime.ordinal(), null, getLocale())); @@ -240,6 +250,9 @@ public class CourseOverviewController extends BasicController { RepositoryEntry entry = entryKeyToRepoEntryMap.get(memberView.getRepoKey()); if(entry != null) { memberView.setDisplayName(entry.getDisplayname()); + memberView.setExternalId(entry.getExternalId()); + memberView.setExternalRef(entry.getExternalRef()); + boolean managedMembersRepo = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.membersmanagement); memberView.getMembership().setManagedMembersRepo(managedMembersRepo); @@ -541,6 +554,8 @@ public class CourseOverviewController extends BasicController { public enum MSCols { key("table.header.key"), title("table.header.displayName"), + externalId("table.header.externalid"), + externalRef("table.header.externalref"), role("table.header.role"), lastTime("table.header.lastTime"), firstTime("table.header.firstTime"), @@ -609,6 +624,8 @@ public class CourseOverviewController extends BasicController { switch(MSCols.values()[col]) { case key: return view.getRepoKey(); case title: return view.getDisplayName(); + case externalId: return view.getExternalId(); + case externalRef: return view.getExternalRef(); case role: return view; case firstTime: return view.getFirstTime(); case lastTime: return view.getLastTime(); @@ -621,6 +638,8 @@ public class CourseOverviewController extends BasicController { private class CourseMemberView { private final Long repoKey; private String displayName; + private String externalId; + private String externalRef; private Date firstTime; private Date lastTime; private final CourseMembership membership = new CourseMembership(); @@ -642,6 +661,22 @@ public class CourseOverviewController extends BasicController { this.displayName = displayName; } + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + + public String getExternalRef() { + return externalRef; + } + + public void setExternalRef(String externalRef) { + this.externalRef = externalRef; + } + public Date getFirstTime() { return firstTime; } diff --git a/src/main/java/org/olat/catalog/CatalogManager.java b/src/main/java/org/olat/catalog/CatalogManager.java index 85f5afef67c52b79714456c463d8acc04dc2d9c8..2fc431cf777973b7c43542fa251db3222f399552 100644 --- a/src/main/java/org/olat/catalog/CatalogManager.java +++ b/src/main/java/org/olat/catalog/CatalogManager.java @@ -41,6 +41,7 @@ import org.olat.basesecurity.SecurityGroup; import org.olat.basesecurity.SecurityGroupMembershipImpl; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.modules.bc.meta.MetaInfo; +import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.PersistenceHelper; import org.olat.core.commons.services.image.ImageService; @@ -691,8 +692,11 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I public void deleteImage(CatalogEntryRef entry) { VFSLeaf imgFile = getImage(entry); if (imgFile != null) { - if(imgFile instanceof MetaInfo) { - ((MetaInfo)imgFile).clearThumbnails(); + if(imgFile instanceof MetaTagged) { + MetaInfo info = ((MetaTagged)imgFile).getMetaInfo(); + if(info != null) { + info.clearThumbnails(); + } } imgFile.delete(); } @@ -701,8 +705,11 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I public boolean setImage(VFSLeaf newImageFile, CatalogEntryRef re) { VFSLeaf currentImage = getImage(re); if(currentImage != null) { - if(currentImage instanceof MetaInfo) { - ((MetaInfo)currentImage).clearThumbnails(); + if(currentImage instanceof MetaTagged) { + MetaInfo info = ((MetaTagged)currentImage).getMetaInfo(); + if(info != null) { + info.clearThumbnails(); + } } currentImage.delete(); } diff --git a/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java b/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java index 69a84f3c3880c66d125279e7924b550b58c7f7ce..9ad081e0efef85d1a0bca2e27b476d4d6b5a41d1 100644 --- a/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java +++ b/src/main/java/org/olat/core/commons/services/image/spi/AbstractImageHelper.java @@ -20,8 +20,8 @@ package org.olat.core.commons.services.image.spi; import java.awt.image.BufferedImage; -import java.io.BufferedInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Iterator; import javax.imageio.ImageIO; @@ -60,24 +60,28 @@ public abstract class AbstractImageHelper implements ImageHelperSPI { } private Size getImageSizeFallback(VFSLeaf media) { - BufferedInputStream fileStrean = null; + InputStream fileStream = null; BufferedImage imageSrc = null; try { - fileStrean = new BufferedInputStream(media.getInputStream()); - imageSrc = ImageIO.read(fileStrean); - if (imageSrc == null) { - // happens with faulty Java implementation, e.g. on MacOSX + fileStream = media.getInputStream(); + if(fileStream != null) { + imageSrc = ImageIO.read(fileStream); + if (imageSrc == null) { + // happens with faulty Java implementation, e.g. on MacOSX + return null; + } + double realWidth = imageSrc.getWidth(); + double realHeight = imageSrc.getHeight(); + return new Size((int)realWidth, (int)realHeight, 0, 0, false); + } else { return null; } - double realWidth = imageSrc.getWidth(); - double realHeight = imageSrc.getHeight(); - return new Size((int)realWidth, (int)realHeight, 0, 0, false); } catch (IOException e) { // log error, don't do anything else log.error("Problem while setting image size to fit for resource::" + media, e); return null; } finally { - IOUtils.closeQuietly(fileStrean); + IOUtils.closeQuietly(fileStream); if (imageSrc != null) { imageSrc.flush(); } @@ -88,17 +92,24 @@ public abstract class AbstractImageHelper implements ImageHelperSPI { Size result = null; Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix); if (iter.hasNext()) { + ImageInputStream stream = null; + InputStream mediaStream = null; ImageReader reader = iter.next(); try { - ImageInputStream stream = new MemoryCacheImageInputStream(media.getInputStream()); - reader.setInput(stream); - int readerMinIndex = reader.getMinIndex(); - int width = reader.getWidth(readerMinIndex); - int height = reader.getHeight(readerMinIndex); - result = new Size(width, height, 0, 0, false); + mediaStream = media.getInputStream(); + if(mediaStream != null) { + stream = new MemoryCacheImageInputStream(mediaStream); + reader.setInput(stream); + int readerMinIndex = reader.getMinIndex(); + int width = reader.getWidth(readerMinIndex); + int height = reader.getHeight(readerMinIndex); + result = new Size(width, height, 0, 0, false); + } } catch (IOException e) { log.error(e.getMessage()); } finally { + IOUtils.closeQuietly(stream); + IOUtils.closeQuietly(mediaStream); reader.dispose(); } } else { diff --git a/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java b/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java index f0e833f1e3083b378b5cb01ae08d5128d5430120..feeb4282cb035ce3628353e65eadcf79f089d54e 100644 --- a/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/video/MovieServiceImpl.java @@ -43,6 +43,7 @@ import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.vfs.LocalFileImpl; import org.olat.core.util.vfs.VFSLeaf; +import org.olat.ims.cp.ui.VFSCPNamedItem; import org.springframework.stereotype.Service; /** @@ -70,7 +71,17 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI { @Override public Size getSize(VFSLeaf media, String suffix) { - File file = ((LocalFileImpl)media).getBasefile(); + File file = null; + if(media instanceof VFSCPNamedItem) { + media = ((VFSCPNamedItem)media).getDelegate(); + } + if(media instanceof LocalFileImpl) { + file = ((LocalFileImpl)media).getBasefile(); + } + if(file == null) { + return null; + } + if(suffix.equals("mp4") || suffix.equals("m4v")) { try(RandomAccessFile accessFile = new RandomAccessFile(file, "r")) { FileChannel ch = accessFile.getChannel(); @@ -96,6 +107,7 @@ public class MovieServiceImpl implements MovieService, ThumbnailSPI { log.error("Cannot extract size of: " + media, e); } } + return null; } diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java index 68776e15ddfc8e4880c4514082e6e1c04d7f3ac2..a43ca489715f0c4a3b3ded77fbde82e099a997a4 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java @@ -300,7 +300,7 @@ public class CheckListAssessmentController extends FormBasicController implement List<BusinessGroup> coachedGroups = courseAdmin ? userCourseEnv.getCourseEnvironment().getCourseGroupManager().getAllBusinessGroups() : env.getCoachedGroups(); - List<AssessmentData> dataList = checkboxManager.getAssessmentDatas(courseOres, courseNode.getIdent(), courseTutor ? re : null, coachedGroups); + List<AssessmentData> dataList = checkboxManager.getAssessmentDatas(courseOres, courseNode.getIdent(), courseTutor || courseAdmin ? re : null, coachedGroups); List<CheckListAssessmentRow> boxList = getAssessmentDataViews(dataList, checkboxColl); Map<Long,CheckListAssessmentRow> identityToView = new HashMap<>(); for(CheckListAssessmentRow box:boxList) { diff --git a/src/main/java/org/olat/ims/cp/ui/VFSCPNamedItem.java b/src/main/java/org/olat/ims/cp/ui/VFSCPNamedItem.java index a3a43e8a44f1c65a4923e80df5369f3c0d4db615..22a5518a331f8b98ab821ba730e4956bf549a1f5 100644 --- a/src/main/java/org/olat/ims/cp/ui/VFSCPNamedItem.java +++ b/src/main/java/org/olat/ims/cp/ui/VFSCPNamedItem.java @@ -32,7 +32,6 @@ import org.olat.core.util.vfs.VFSLeaf; * Initial Date: 5 mai 2011 <br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -//fxdiff FXOLAT-125: virtual file system for CP public class VFSCPNamedItem extends NamedLeaf { public VFSCPNamedItem(String name, VFSLeaf delegate) { diff --git a/src/main/java/org/olat/login/AfterLoginInterceptionController.java b/src/main/java/org/olat/login/AfterLoginInterceptionController.java index f1fb01c9f8246eb82571f11b1fff38162a45e67d..63533746dee055b34ed480880a6597bcd99d27db 100644 --- a/src/main/java/org/olat/login/AfterLoginInterceptionController.java +++ b/src/main/java/org/olat/login/AfterLoginInterceptionController.java @@ -39,6 +39,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle import org.olat.core.gui.control.generic.wizard.WizardInfoController; import org.olat.properties.Property; import org.olat.properties.PropertyManager; +import org.springframework.beans.factory.annotation.Autowired; /** * Description: Presents running once controllers to the user right after login. @@ -74,12 +75,14 @@ public class AfterLoginInterceptionController extends BasicController { protected static final String ORDER_KEY = "order"; private static final String PROPERTY_CAT = "afterLogin"; + + @Autowired + private AfterLoginInterceptionManager aLIM; public AfterLoginInterceptionController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); vC = createVelocityContainer("afterlogin"); actualPanel = new Panel("actualPanel"); - AfterLoginInterceptionManager aLIM = AfterLoginInterceptionManager.getInstance(); if (!aLIM.containsAnyController()) { dispose(); return; @@ -87,6 +90,9 @@ public class AfterLoginInterceptionController extends BasicController { List<Map<String, Object>> aftctrlsTmp = aLIM.getAfterLoginControllerList(); aftctrls = (List<Map<String, Object>>) ((ArrayList<Map<String, Object>>) aftctrlsTmp).clone(); + // sort controllers according to config + aftctrls = AfterLoginInterceptionManager.sortControllerListByOrder(aftctrls); + // load all UserProps concerning afterlogin/runOnce workflow => only 1 // db-call for all props pm = PropertyManager.getInstance(); @@ -145,9 +151,6 @@ public class AfterLoginInterceptionController extends BasicController { dispose(); return; } - - // sort controllers according to config - aftctrls = AfterLoginInterceptionManager.sortControllerListByOrder(aftctrls); wiz = new WizardInfoController(ureq, aftctrls.size()); vC.put("wizard", wiz.getInitialComponent()); diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index e2a79c6a19bacf924c58cae24373f378910957d5..1c9d4be0a80b3f8b324527d4d4a96bd159289296 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -48,6 +48,7 @@ import org.olat.catalog.CatalogEntry; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.modules.bc.meta.MetaInfo; +import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DBQuery; import org.olat.core.commons.persistence.PersistenceHelper; @@ -169,8 +170,11 @@ public class RepositoryManager extends BasicManager { public void deleteImage(RepositoryEntry re) { VFSLeaf imgFile = getImage(re); if (imgFile != null) { - if(imgFile instanceof MetaInfo) { - ((MetaInfo)imgFile).clearThumbnails(); + if(imgFile instanceof MetaTagged) { + MetaInfo info = ((MetaTagged)imgFile).getMetaInfo(); + if(info != null) { + info.clearThumbnails(); + } } imgFile.delete(); } @@ -194,8 +198,11 @@ public class RepositoryManager extends BasicManager { public boolean setImage(VFSLeaf newImageFile, RepositoryEntry re) { VFSLeaf currentImage = getImage(re); if(currentImage != null) { - if(currentImage instanceof MetaInfo) { - ((MetaInfo)currentImage).clearThumbnails(); + if(currentImage instanceof MetaTagged) { + MetaInfo info = ((MetaTagged)currentImage).getMetaInfo(); + if(info != null) { + info.clearThumbnails(); + } } currentImage.delete(); } diff --git a/src/main/java/org/olat/repository/ui/list/_content/details.html b/src/main/java/org/olat/repository/ui/list/_content/details.html index af733ae0a29cf66c90f1177d44685d50edef0499..d0c8ab6a0a42be3ce53d9561fe27f2eee14ba1ed 100644 --- a/src/main/java/org/olat/repository/ui/list/_content/details.html +++ b/src/main/java/org/olat/repository/ui/list/_content/details.html @@ -241,7 +241,6 @@ </div> #if ($referenceDetails) - <h1>lal</h1> <div class="panel panel-default"> <div class="panel-heading" data-toggle="collapse" data-target="#collapseUsage"> <h3 class="panel-title"> diff --git a/src/main/java/org/olat/user/ProfileFormController.java b/src/main/java/org/olat/user/ProfileFormController.java index 42848fa7ec6ad71ce956c3c360235c73a9040d48..03cb6447506b2f4853d9137e183aea0451289303 100644 --- a/src/main/java/org/olat/user/ProfileFormController.java +++ b/src/main/java/org/olat/user/ProfileFormController.java @@ -500,7 +500,11 @@ public class ProfileFormController extends FormBasicController { cal.add(Calendar.DAY_OF_WEEK, ChangeEMailController.TIME_OUT); String time = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, ureq.getLocale()).format(cal.getTime()); // create body and subject for email - body = translate("email.change.body", new String[] { serverpath + "/dmz/emchange/index.html?key=" + tk.getRegistrationKey() + "&lang=" + ureq.getLocale().getLanguage(), time, currentEmail, changedEmail }) + String link = serverpath + "/dmz/emchange/index.html?key=" + tk.getRegistrationKey() + "&lang=" + ureq.getLocale().getLanguage(); + if(Settings.isDebuging()) { + logInfo(link, null); + } + body = translate("email.change.body", new String[] { link, time, currentEmail, changedEmail }) + SEPARATOR + translate("email.change.wherefrom", new String[] { serverpath, today, ip }); subject = translate("email.change.subject"); // send email