From a39705a0eea5fc9ba7fc004e93a0d03030d9a6ab Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 7 Mar 2018 21:16:58 +0100 Subject: [PATCH] OO-3352: remove more id --- .../org/olat/_spring/extensionContext.xml | 20 --- .../sysinfo/UserSessionSnoopController.java | 157 ------------------ .../olat/admin/sysinfo/_content/snoop.html | 3 - .../java/org/olat/core/logging/Tracing.java | 6 +- .../core/logging/activity/LoggingObject.java | 4 +- .../activity/UserActivityLoggerImpl.java | 45 ++--- .../java/org/olat/core/util/SessionInfo.java | 19 +-- .../statistic/export/LogLineConverter.java | 16 +- .../gui/control/OlatDmzTopNavController.java | 1 - 9 files changed, 43 insertions(+), 228 deletions(-) delete mode 100644 src/main/java/org/olat/admin/sysinfo/UserSessionSnoopController.java delete mode 100644 src/main/java/org/olat/admin/sysinfo/_content/snoop.html diff --git a/src/main/java/org/olat/_spring/extensionContext.xml b/src/main/java/org/olat/_spring/extensionContext.xml index d09051a9821..1e2dd3fba7c 100644 --- a/src/main/java/org/olat/_spring/extensionContext.xml +++ b/src/main/java/org/olat/_spring/extensionContext.xml @@ -304,26 +304,6 @@ </property> </bean> - <!-- Devel / snoop user session --> - <bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints"> - <property name="order" value="15110" /> - <property name="actionController"> - <bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype"> - <property name="className" value="org.olat.admin.sysinfo.UserSessionSnoopController"/> - </bean> - </property> - <property name="navigationKey" value="snoop" /> - <property name="parentTreeNodeIdentifier" value="develParent" /> - <property name="translationPackage" value="org.olat.admin"/> - <property name="i18nActionKey" value="menu.snoop"/> - <property name="i18nDescriptionKey" value="menu.snoop.alt"/> - <property name="extensionPoints"> - <list> - <value>org.olat.admin.SystemAdminMainController</value> - </list> - </property> - </bean> - <!-- Privacy admin. panel --> <bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints"> <property name="order" value="7423" /> diff --git a/src/main/java/org/olat/admin/sysinfo/UserSessionSnoopController.java b/src/main/java/org/olat/admin/sysinfo/UserSessionSnoopController.java deleted file mode 100644 index 1e4d382c998..00000000000 --- a/src/main/java/org/olat/admin/sysinfo/UserSessionSnoopController.java +++ /dev/null @@ -1,157 +0,0 @@ -/** - * <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.admin.sysinfo; - -import java.util.Enumeration; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; - -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.velocity.VelocityContainer; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.controller.BasicController; - -/** - * - * Initial date: 16.11.2012<br> - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com - * - */ -public class UserSessionSnoopController extends BasicController { - - private final VelocityContainer mySnoop; - - public UserSessionSnoopController(UserRequest ureq, WindowControl wControl) { - super(ureq, wControl); - - mySnoop = createVelocityContainer("snoop"); - loadModel(ureq); - putInitialPanel(mySnoop); - } - - private void loadModel(UserRequest ureq) { - mySnoop.contextPut("snoop", getSnoop(ureq)); - } - - @Override - protected void event(UserRequest ureq, Component source, Event event) { - // - } - - @Override - protected void doDispose() { - // - } - - /** - * @param ureq - * @return Formatted HTML - */ - private String getSnoop(UserRequest ureq) { - StringBuilder sb = new StringBuilder(); - HttpServletRequest hreq = ureq.getHttpReq(); - sb.append("<h4>Request attributes:</h4>"); - Enumeration<String> e = hreq.getAttributeNames(); - while (e.hasMoreElements()) { - String key = e.nextElement(); - Object value = hreq.getAttribute(key); - appendFormattedKeyValue(sb, key, value); - } - - appendFormattedKeyValue(sb, "Protocol", hreq.getProtocol()); - appendFormattedKeyValue(sb, "Scheme", hreq.getScheme()); - appendFormattedKeyValue(sb, "Server Name", hreq.getServerName()); - appendFormattedKeyValue(sb, "Server Port", Integer.valueOf(hreq.getServerPort())); - appendFormattedKeyValue(sb, "Remote Addr", hreq.getRemoteAddr()); - appendFormattedKeyValue(sb, "Remote Host", hreq.getRemoteHost()); - appendFormattedKeyValue(sb, "Character Encoding", hreq.getCharacterEncoding()); - appendFormattedKeyValue(sb, "Content Length", Integer.valueOf(hreq.getContentLength())); - appendFormattedKeyValue(sb, "Content Type", hreq.getContentType()); - appendFormattedKeyValue(sb, "Locale", hreq.getLocale()); - - sb.append("<h4>Parameter names in this hreq:</h4>"); - e = hreq.getParameterNames(); - while (e.hasMoreElements()) { - String key = e.nextElement(); - String[] values = hreq.getParameterValues(key); - StringBuilder value = new StringBuilder(); - for (int i = 0; i < values.length; i++) { - value.append(" ").append(values[i]); - } - appendFormattedKeyValue(sb, key, value); - } - - sb.append("<h4>Headers in this hreq:</h4>"); - e = hreq.getHeaderNames(); - while (e.hasMoreElements()) { - String key = e.nextElement(); - String value = hreq.getHeader(key); - appendFormattedKeyValue(sb, key, value); - } - sb.append("<h4>Cookies in this hreq:</h4>"); - Cookie[] cookies = hreq.getCookies(); - if (cookies != null) { - for (int i = 0; i < cookies.length; i++) { - Cookie cookie = cookies[i]; - appendFormattedKeyValue(sb, cookie.getName(), cookie.getValue()); - } - } - - sb.append("<h4>Hreq parameters:</h4>"); - appendFormattedKeyValue(sb, "Request Is Secure", Boolean.valueOf(hreq.isSecure())); - appendFormattedKeyValue(sb, "Auth Type", hreq.getAuthType()); - appendFormattedKeyValue(sb, "HTTP Method", hreq.getMethod()); - appendFormattedKeyValue(sb, "Remote User", hreq.getRemoteUser()); - appendFormattedKeyValue(sb, "Request URI", hreq.getRequestURI()); - appendFormattedKeyValue(sb, "Context Path", hreq.getContextPath()); - appendFormattedKeyValue(sb, "Servlet Path", hreq.getServletPath()); - appendFormattedKeyValue(sb, "Path Info", hreq.getPathInfo()); - appendFormattedKeyValue(sb, "Path Trans", hreq.getPathTranslated()); - appendFormattedKeyValue(sb, "Query String", hreq.getQueryString()); - - HttpSession hsession = hreq.getSession(); - appendFormattedKeyValue(sb, "Session Created Time", Long.valueOf(hsession.getCreationTime())); - appendFormattedKeyValue(sb, "Session Last Accessed Time", Long.valueOf(hsession.getLastAccessedTime())); - appendFormattedKeyValue(sb, "Session Max Inactive Interval Seconds", Long.valueOf(hsession.getMaxInactiveInterval())); - - sb.append("<h4>Session values:</h4> "); - Enumeration<String> names = hsession.getAttributeNames(); - while (names.hasMoreElements()) { - String name = names.nextElement(); - appendFormattedKeyValue(sb, name, hsession.getAttribute(name)); - } - return sb.toString(); - } - - private void appendFormattedKeyValue(StringBuilder sb, String key, Object value) { - sb.append(" <b>"); - sb.append(key); - sb.append(":</b> "); - sb.append(value); - sb.append("<br />"); - } - - - -} diff --git a/src/main/java/org/olat/admin/sysinfo/_content/snoop.html b/src/main/java/org/olat/admin/sysinfo/_content/snoop.html deleted file mode 100644 index 05fec39b0fc..00000000000 --- a/src/main/java/org/olat/admin/sysinfo/_content/snoop.html +++ /dev/null @@ -1,3 +0,0 @@ -<h4>$r.translate("sysinfo")</h4> - -$snoop \ No newline at end of file diff --git a/src/main/java/org/olat/core/logging/Tracing.java b/src/main/java/org/olat/core/logging/Tracing.java index 93b7f8c69f3..892d6248151 100644 --- a/src/main/java/org/olat/core/logging/Tracing.java +++ b/src/main/java/org/olat/core/logging/Tracing.java @@ -106,7 +106,7 @@ public class Tracing { private static long __debugRefNum__ = 0; // VM local cache to have one logger object per class - private static final ConcurrentMap<Class<?>, OLog> loggerLookupMap = new ConcurrentHashMap<Class<?>, OLog>(); + private static final ConcurrentMap<Class<?>, OLog> loggerLookupMap = new ConcurrentHashMap<>(); /** * per-thread singleton holding the actual HttpServletRequest which is the @@ -377,7 +377,7 @@ public class Tracing { } } - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(256); if (Settings.isDebuging()) { // Short version for console output during debugging if (userObj != null) { @@ -439,7 +439,7 @@ public class Tracing { referer = ureq.getHeader("Referer"); } - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(2048); if (!Settings.isDebuging()) { sb.append(PREFIX); sb.append(category); diff --git a/src/main/java/org/olat/core/logging/activity/LoggingObject.java b/src/main/java/org/olat/core/logging/activity/LoggingObject.java index 1f1c5efde24..3dccd456a79 100644 --- a/src/main/java/org/olat/core/logging/activity/LoggingObject.java +++ b/src/main/java/org/olat/core/logging/activity/LoggingObject.java @@ -126,8 +126,8 @@ public class LoggingObject extends PersistentObject { * may throw IllegalArgumentExceptions if it doesn't like your input. * <p> * @param sessionId the id of the session - which is directly stored to the database - * @param identityKey TODO - * @param identityName TODO + * @param identityKey The identity primary key + * @param identityName The user name * @param actionCrudType the crudAction type * @param action - the actual log message */ diff --git a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java index a5311600d2b..ebf282d2b90 100644 --- a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java +++ b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java @@ -244,7 +244,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { session_ = bluePrint.session_; identity_ = bluePrint.identity_; stickyActionType_ = bluePrint.stickyActionType_; - resourceableList_ = bluePrint.resourceableList_==null ? null : new LinkedList<ILoggingResourceable>(bluePrint.resourceableList_); + resourceableList_ = bluePrint.resourceableList_==null ? null : new LinkedList<>(bluePrint.resourceableList_); // get the businessPath from the windowControl if possible String businessPath = null; @@ -252,7 +252,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { if (wControl.getBusinessControl() instanceof StackedBusinessControl) { StackedBusinessControl sbc = (StackedBusinessControl)wControl.getBusinessControl(); final List<ContextEntry> ces = sbc.getContextEntryStack(); - bcContextEntries_ = ces!=null ? new LinkedList<ContextEntry>(ces) : null; + bcContextEntries_ = ces!=null ? new LinkedList<>(ces) : null; } businessPath = wControl.getBusinessControl().getAsString(); @@ -344,8 +344,6 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { // don't set runtimeParent ! } - - @Override public Identity getLoggedIdentity() { if(identity_ == null && session_ != null) { @@ -354,6 +352,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { return identity_; } + @Override public void frameworkSetSession(UserSession session) { if (session_==session) { return; @@ -374,11 +373,12 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { */ private List<ILoggingResourceable> getLoggingResourceableList() { if (resourceableList_==null) { - resourceableList_ = new LinkedList<ILoggingResourceable>(); + resourceableList_ = new LinkedList<>(); } return resourceableList_; } + @Override public void addLoggingResourceInfo(ILoggingResourceable loggingResourceable) { if (loggingResourceable==null) { throw new IllegalArgumentException("resourceInfo must not be null"); @@ -421,7 +421,8 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { threadLocalUserActivityLogger.addLoggingResourceInfo(loggingResourceable); } } - + + @Override public void frameworkSetBusinessPath(String businessPath) { if (businessPath==businessPath_ || businessPath==null || businessPath.length()==0 || (businessPath_!=null && businessPath.length()<businessPath_.length())) { return; @@ -438,8 +439,9 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { } } + @Override public void frameworkSetBCContextEntries(List<ContextEntry> bcEntries) { - if (bcContextEntries_==bcEntries || bcEntries==null || bcEntries.size()==0 || (bcContextEntries_!=null && bcEntries.size()<bcContextEntries_.size())) { + if (bcContextEntries_==bcEntries || bcEntries==null || bcEntries.isEmpty() || (bcContextEntries_!=null && bcEntries.size()<bcContextEntries_.size())) { return; } if (bcEntries!=null) { @@ -453,7 +455,8 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { threadLocalUserActivityLogger.frameworkSetBCContextEntries(bcEntries); } } - + + @Override public void frameworkSetBusinessPathFromWindowControl(WindowControl wControl) { if (wControl!=null && wControl.getBusinessControl()!=null) { if (wControl.getBusinessControl() instanceof StackedBusinessControl) { @@ -484,8 +487,8 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { * in the corresponding fields */ private List<ILoggingResourceable> getCombinedOrderedLoggingResourceables(ILoggingResourceable... additionalLoggingResourceables) { - List<ILoggingResourceable> result = new LinkedList<ILoggingResourceable>(); - List<ILoggingResourceable> inputCopy = new LinkedList<ILoggingResourceable>(getLoggingResourceableList()); + List<ILoggingResourceable> result = new LinkedList<>(); + List<ILoggingResourceable> inputCopy = new LinkedList<>(getLoggingResourceableList()); if (additionalLoggingResourceables!=null) { for (int i = 0; i < additionalLoggingResourceables.length; i++) { ILoggingResourceable additionalLoggingResourceable = additionalLoggingResourceables[i]; @@ -511,7 +514,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { } } if (bcContextEntries_!=null) { - LinkedList<ContextEntry> bcContextEntriesCopy = new LinkedList<ContextEntry>(); + LinkedList<ContextEntry> bcContextEntriesCopy = new LinkedList<>(); for (Iterator<ContextEntry> it = bcContextEntries_.iterator(); it.hasNext();) { ContextEntry ce = it.next(); if (!bcContextEntriesCopy.contains(ce)) { @@ -590,6 +593,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { return stickyActionType_; } + @Override public void log(ILoggingAction loggingAction, Class<?> callingClass, ILoggingResourceable... lriOrNull) { Long logStart = null; if (log_.isDebug()) { @@ -624,21 +628,18 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { } final String sessionId; - if (session_.getSessionInfo() !=null && - session_.getSessionInfo().getSession()==null) { + if (session_.getSessionInfo() != null && + session_.getSessionInfo().getSession() == null) { //background taks sessionId = Thread.currentThread().getName(); - } else if (session_.getSessionInfo()==null || - session_.getSessionInfo().getSession()==null || - session_.getSessionInfo().getSession().getId()==null || - session_.getSessionInfo().getSession().getId().length()==0) { + } else if (session_.getSessionInfo() == null) { // no session Id available - odd log_.error("No session information available to UserActivityLogger. Cannot write log entry: "+ crudAction.name()+":"+actionVerb.name()+", "+actionObject+", "+ convertLoggingResourceableListToString(resourceInfos), new Exception()); return; } else { - sessionId = session_.getSessionInfo().getSession().getId(); + sessionId = Long.toString(session_.getSessionInfo().getCreationTime()); } Identity identity = session_.getIdentity(); @@ -655,7 +656,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { final String identityKeyStr = String.valueOf(identityKey); for (Iterator<ILoggingResourceable> it = resourceInfos.iterator(); it.hasNext();) { ILoggingResourceable lr = it.next(); - // fxdiff: we want this info as too much actionTypes are non-admin and log-entry will then be without value not containing targetIdent!, see FXOLAT-104 + // we want this info as too much actionTypes are non-admin and log-entry will then be without value not containing targetIdent!, see FXOLAT-104 if (lr.getResourceableType()==StringResourceableType.targetIdentity && lr.getId().equals(identityKeyStr)) { if (log_.isDebug()) { // complain @@ -664,12 +665,12 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { (new Exception("OLAT-4955 debug stacktrac")).printStackTrace(printWriter); log_.debug("OLAT-4955: Not storing targetIdentity for non-admin logging actions. A non-admin logging action wanted to store a user other than the one from the session: action="+loggingAction+", fieldId="+loggingAction.getJavaFieldIdForDebug(), strackTraceAsStringWriter.toString()); } - // OLAT-4955: remove targetIdentity (fxdiff: only if same as executing identity!) + // remove targetIdentity (fxdiff: only if same as executing identity!) it.remove(); } } } - // fxdiff: end of moved code + // end of moved code if(resourceInfos != null) { //remove all ignorable resources for(Iterator<ILoggingResourceable> riIterator=resourceInfos.iterator(); riIterator.hasNext(); ) { @@ -747,7 +748,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { Locale locale = I18nManager.getInstance().getLocaleOrDefault(identity.getUser().getPreferences().getLanguage()); //prepare the user properties, set them at once - List<String> tmpUserProperties = new ArrayList<String>(12); + List<String> tmpUserProperties = new ArrayList<>(12); for(Iterator<String> iterator = userProperties_.iterator(); iterator.hasNext();) { String userPropString = identity.getUser().getPropertyOrIdentityEnvAttribute(iterator.next(), locale); boolean shorten = false; diff --git a/src/main/java/org/olat/core/util/SessionInfo.java b/src/main/java/org/olat/core/util/SessionInfo.java index edf6c2a3ab5..fd894d20b98 100644 --- a/src/main/java/org/olat/core/util/SessionInfo.java +++ b/src/main/java/org/olat/core/util/SessionInfo.java @@ -86,10 +86,8 @@ public class SessionInfo implements Serializable { secure = false; creationTime = new Date().getTime(); } - - /** - * @see java.lang.Object#toString() - */ + + @Override public String toString() { return String.format(FORMATTED, login, firstname, lastname, fromIP, fromFQN, authProvider, isWebDAV, isREST, isSecure(), getWebMode(), getSessionDuration() / 1000); @@ -272,7 +270,11 @@ public class SessionInfo implements Serializable { * @return timestamp in nanoseconds */ public long getLastClickTime(){ - return this.timestmp; + return timestmp; + } + + public long getCreationTime() { + return creationTime; } public long getSessionDuration(){ @@ -292,11 +294,8 @@ public class SessionInfo implements Serializable { */ public void setWebModeFromUreq(UserRequest ureq) { String deliveryMode = "web 1.0"; // default, e.g. when connecting with webdav - if (ureq != null) { - // calculate ajax delivery mode - if (Windows.getWindows(ureq).getWindowManager().isAjaxEnabled()) { - deliveryMode = "web 2.0"; - } + if (ureq != null && Windows.getWindows(ureq).getWindowManager().isAjaxEnabled()) { + deliveryMode = "web 2.0"; } this.webMode = deliveryMode; } diff --git a/src/main/java/org/olat/course/statistic/export/LogLineConverter.java b/src/main/java/org/olat/course/statistic/export/LogLineConverter.java index bba51ebe260..ffd04b000c0 100644 --- a/src/main/java/org/olat/course/statistic/export/LogLineConverter.java +++ b/src/main/java/org/olat/course/statistic/export/LogLineConverter.java @@ -55,15 +55,15 @@ public class LogLineConverter { private static final OLog log_ = Tracing.createLoggerFor(LogLineConverter.class); /** spring property defining all properties - including the order in which they will be exported **/ - private List<String> orderedExportedProperties = new ArrayList<String>(); + private List<String> orderedExportedProperties = new ArrayList<>(); /** spring property defining all properties which should be anonymized - they must also be in orderedExportedProperties **/ - private Set<String> anonymizedProperties = new HashSet<String>(); + private Set<String> anonymizedProperties = new HashSet<>(); /** internal property which contains (javax.bean) PropertyDescriptors of each of the above property - * given the properties are available */ - private List<PropertyDescriptor> orderedExportedPropertyDescriptors = new ArrayList<PropertyDescriptor>(); + private List<PropertyDescriptor> orderedExportedPropertyDescriptors = new ArrayList<>(); /** * spring property setter for orderedExportedProperties - which is the list of all properties to be extracted @@ -120,7 +120,7 @@ public class LogLineConverter { * excluding those properties which could not be retrieved, i.e. for which no PropertyDescriptor could be created */ public String getCSVHeader() { - List<String> propertyNames = new ArrayList<String>(); + List<String> propertyNames = new ArrayList<>(); for (Iterator<PropertyDescriptor> it = orderedExportedPropertyDescriptors.iterator(); it.hasNext();) { PropertyDescriptor pd = it.next(); propertyNames.add(pd.getName()); @@ -136,7 +136,7 @@ public class LogLineConverter { * @return the CSV line representing the given LoggingObject */ public String getCSVRow(LoggingObject loggingObject, boolean anonymize, Long resourceableId) { - List<String> loggingObjectList = new ArrayList<String>(); + List<String> loggingObjectList = new ArrayList<>(); for (Iterator<PropertyDescriptor> it = orderedExportedPropertyDescriptors.iterator(); it.hasNext();) { PropertyDescriptor pd = it.next(); @@ -150,11 +150,7 @@ public class LogLineConverter { // do anonymization strValue = makeAnonymous(String.valueOf(value), resourceableId); } - } catch (IllegalArgumentException e) { - // nothing to do - } catch (IllegalAccessException e) { - // nothing to do - } catch (InvocationTargetException e) { + } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) { // nothing to do } loggingObjectList.add(strValue); diff --git a/src/main/java/org/olat/gui/control/OlatDmzTopNavController.java b/src/main/java/org/olat/gui/control/OlatDmzTopNavController.java index 62c0fe73231..c5812136b54 100644 --- a/src/main/java/org/olat/gui/control/OlatDmzTopNavController.java +++ b/src/main/java/org/olat/gui/control/OlatDmzTopNavController.java @@ -43,7 +43,6 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.creator.ControllerCreator; import org.olat.core.gui.control.generic.popup.PopupBrowserWindow; -import org.olat.core.util.i18n.I18nManager; import org.olat.core.util.i18n.I18nModule; import org.olat.login.AboutController; import org.springframework.beans.factory.annotation.Autowired; -- GitLab