diff --git a/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java b/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java index 1df36fb6cac73f910804b2a522d26d71829738f6..3acb6a177f0070ff853299f0a9bd0780fc8789d8 100644 --- a/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java +++ b/src/main/java/org/olat/core/commons/editor/htmleditor/WysiwygFactory.java @@ -141,7 +141,7 @@ public class WysiwygFactory { * @return XHTML page */ public static String createXHtmlFileContent(String bodyMarkup, String title) { - StringBuffer fileContent = new StringBuffer(); + StringBuilder fileContent = new StringBuilder(); fileContent.append(HTMLEditorController.DOCTYPE).append(HTMLEditorController.OPEN_HTML).append(HTMLEditorController.OPEN_HEAD); fileContent.append(HTMLEditorController.GENERATOR_META).append(HTMLEditorController.UTF8CHARSET); fileContent.append(HTMLEditorController.OPEN_TITLE).append(title).append(HTMLEditorController.CLOSE_TITLE); diff --git a/src/main/java/org/olat/core/gui/components/AbstractComponent.java b/src/main/java/org/olat/core/gui/components/AbstractComponent.java index 45d432acfeac144a9453164b26d99a63115b2b21..e9165df8895a53b4f637ab5bd3094990900148bd 100644 --- a/src/main/java/org/olat/core/gui/components/AbstractComponent.java +++ b/src/main/java/org/olat/core/gui/components/AbstractComponent.java @@ -57,6 +57,7 @@ public abstract class AbstractComponent implements Component { private String elementCssClass; private long timestamp = 1l; + private String timestampID = "1"; private boolean staticCmp = true; private boolean visible = true; @@ -140,7 +141,9 @@ public abstract class AbstractComponent implements Component { * @return a valid JS variableName */ private static String secureJSVarName(String id) { - if(StringUtils.isBlank(id)) return "o_"+Long.toString(CodeHelper.getRAMUniqueID()); + if(StringUtils.isBlank(id)) { + return "o_" + Long.toString(CodeHelper.getRAMUniqueID()); + } id = id.replace("-", "_"); // no - id = id.replace(".", "_"); // no dots @@ -202,12 +205,13 @@ public abstract class AbstractComponent implements Component { * (e.g. for CPComponent, so that the browser loads images correctly). only * called when the component is visible */ + @Override public void validate(UserRequest ureq, ValidationResult vr) { if (this.dirty) { if(!staticCmp) { timestamp++; + timestampID = Long.toString(timestamp); } - if ( log_.isDebug() ) log_.debug("increment component.timestamp new value=" + timestamp + " ureq=" + ureq + " component=" + this); } } @@ -458,7 +462,7 @@ public abstract class AbstractComponent implements Component { if(staticCmp) { return "1"; } - return Long.toString(timestamp); + return timestampID; } } \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java b/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java index b9bf3c86b8406cd411f8b3b71594e43e6b05b94d..7ef17d1255c7f445e4236a9928c0de53f3f9948a 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/FormItemContainer.java @@ -88,6 +88,11 @@ public interface FormItemContainer extends FormItem, FormItemCollection { */ public Map<String, FormItem> getFormComponents(); + /** + * @return True if the container manages this item. + */ + public boolean hasFormComponent(FormItem item); + /** * * @param name diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java index 4ddd5c6f48981376972b3046fc158c00fbe2c42f..140c93369f616fb189e48b61b8e43788d2aa329f 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java @@ -701,7 +701,7 @@ public class Form extends LogDelegator { public boolean visit(FormItem comp, UserRequest ureq) { if (comp instanceof FormItemContainer) { FormItemContainer new_name = (FormItemContainer) comp; - if(new_name.getFormComponents().containsValue(child)){ + if(new_name.hasFormComponent(child)){ parentContainer = (FormItemContainer)comp; return false; } @@ -717,13 +717,13 @@ public class Form extends LogDelegator { public boolean visit(FormItem comp, UserRequest ureq) { if (comp instanceof FormItemContainer) { FormItemContainer fic = (FormItemContainer)comp; - Map<String, FormItem> pairs = fic.getFormComponents(); + Iterable<FormItem> pairs = fic.getFormItems(); //go to next container if no elements inside - if(pairs == null || pairs.size()==0) return true; - //otherwise iterate overall elements and evaluate dependency rules - Iterable<FormItem> elms= pairs.values(); - for (FormItem item : elms) { - fic.evalDependencyRuleSetFor(ureq, item); + if(pairs != null) { + //otherwise iterate overall elements and evaluate dependency rules + for (FormItem item : pairs) { + fic.evalDependencyRuleSetFor(ureq, item); + } } } return true; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java index 2553dc693648a0de670caf06eff3e5f90cc813c7..111d722ce15e8904817c0172c3b4289860be6b47 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java @@ -59,7 +59,7 @@ public abstract class FormBaseComponentImpl extends AbstractComponent implements } public String getFormDispatchId(){ - return DISPPREFIX+super.getDispatchID(); + return DISPPREFIX.concat(super.getDispatchID()); } @Override diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java index adbff34c9b5ba70b39ac2c56c82611a675673d12..552784937efdd44c7d846175b95affdd6a665fbe 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java @@ -25,8 +25,6 @@ */ package org.olat.core.gui.components.form.flexible.impl; -import java.util.Map; - import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; @@ -625,8 +623,8 @@ public abstract class FormBasicController extends BasicController { public void run() { // Dispose also disposable form items (such as file uploads that needs to // cleanup temporary files) - Map<String, FormItem> formItems = FormBasicController.this.flc.getFormComponents(); - for (FormItem formItem : formItems.values()) { + Iterable<FormItem> formItems = FormBasicController.this.flc.getFormItems(); + for (FormItem formItem : formItems) { if (formItem instanceof Disposable) { Disposable disposableFormItem = (Disposable) formItem; disposableFormItem.dispose(); diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java index 412684fefb892e0eba53d8bc700a36eb4800c5d8..8c7bc7efe2a965243e3fee44e570f561244c84e0 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormDecorator.java @@ -25,8 +25,6 @@ */ package org.olat.core.gui.components.form.flexible.impl; -import java.util.Map; - import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.SpacerElement; @@ -152,9 +150,7 @@ public class FormDecorator { * @return */ private FormItem getFormItem(String formItemName) { - Map<String, FormItem> comps = container.getFormComponents(); - FormItem foco = comps.get(formItemName); - return foco; + return container.getFormComponent(formItemName); } } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java index a67ef4fd603036a3395c871e804c5f3898adce91..91525a6b6342b9cd8376bee1ad47a7eb9addd9e4 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormItemImpl.java @@ -515,7 +515,7 @@ public abstract class FormItemImpl implements FormItem, InlineElement { return ((FormBaseComponentIdProvider)comp).getFormDispatchId(); } else { //do the same as the FormBaseComponentIdProvider would do - return DISPPREFIX+comp.getDispatchID(); + return DISPPREFIX.concat(comp.getDispatchID()); } } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java index b6480cfad0e4a5455cce57e79321b604ff42293a..e9df3ee88dbcec472998288d5e9bd7e27097c701 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormLayoutContainer.java @@ -345,12 +345,19 @@ public class FormLayoutContainer extends FormItemImpl implements FormItemContain return merged; } + @Override public Map<String, FormItem> getFormComponents() { Map<String,FormItem> merged = new HashMap<String, FormItem>(formComponents); merged.putAll(listeningOnlyFormComponents); return Collections.unmodifiableMap(merged); } + @Override + public boolean hasFormComponent(FormItem item) { + return formComponents.containsValue(item) + || listeningOnlyFormComponents.containsValue(item); + } + public FormItem getFormComponent(String name){ if(formComponents.containsKey(name)) { return formComponents.get(name); @@ -496,9 +503,7 @@ public class FormLayoutContainer extends FormItemImpl implements FormItemContain //enable / disable this super.setEnabled(isEnabled); //iterate over all components and disable / enable them - Collection<FormItem> formItems = getFormComponents().values(); - for (Iterator<FormItem> iter = formItems.iterator(); iter.hasNext();) { - FormItem element = iter.next(); + for (FormItem element : getFormItems()) { element.setEnabled(isEnabled); } } @@ -657,16 +662,15 @@ public class FormLayoutContainer extends FormItemImpl implements FormItemContain * * @see org.olat.core.gui.control.Disposable#dispose() */ + @Override public void dispose() { // Dispose also disposable form items (such as file uploads that needs to // cleanup temporary files) - Map<String, FormItem> formItems = this.getFormComponents(); - for (FormItem formItem : formItems.values()) { + for (FormItem formItem : getFormItems()) { if (formItem instanceof Disposable) { Disposable disposableFormItem = (Disposable) formItem; disposableFormItem.dispose(); } } } - } 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 67185a79b92386db20c93e544a6d13b0bd0df47d..69ea60032ec7cc1899192a70ad4b6bac81b443ee 100644 --- a/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java +++ b/src/main/java/org/olat/core/logging/activity/UserActivityLoggerImpl.java @@ -849,7 +849,7 @@ public class UserActivityLoggerImpl implements IUserActivityLogger { /** toString for debug **/ private String convertLoggingResourceableListToString(List<ILoggingResourceable> resourceInfos) { - StringBuffer loggingResourceableListToString = new StringBuffer("[LoggingResourceables: "); + StringBuilder loggingResourceableListToString = new StringBuilder("[LoggingResourceables: "); loggingResourceableListToString.append(resourceInfos.size()); for (Iterator<ILoggingResourceable> iterator = resourceInfos.iterator(); iterator.hasNext();) { ILoggingResourceable loggingResourceable = iterator.next(); diff --git a/src/main/java/org/olat/core/util/i18n/I18nManager.java b/src/main/java/org/olat/core/util/i18n/I18nManager.java index 733e1a4b48da18ac6df0de5a9d503bde425cd7e4..ca766fee3d3579b8a8adab3137082190965d0a40 100644 --- a/src/main/java/org/olat/core/util/i18n/I18nManager.java +++ b/src/main/java/org/olat/core/util/i18n/I18nManager.java @@ -139,6 +139,7 @@ public class I18nManager extends BasicManager { private ConcurrentMap<String, Properties> cachedBundles = new ConcurrentHashMap<String, Properties>(); private ConcurrentMap<String, String> cachedJSTranslatorData = new ConcurrentHashMap<String, String>(); private ConcurrentMap<String, Deque<String>> referencingBundlesIndex = new ConcurrentHashMap<String, Deque<String>>(); + private static final ConcurrentMap<Locale,String> localeToLocaleKey = new ConcurrentHashMap<>(); private boolean cachingEnabled = true; private static FilenameFilter i18nFileFilter = new FilenameFilter() { @@ -1689,26 +1690,35 @@ public class I18nManager extends BasicManager { * @return */ public String getLocaleKey(Locale locale) { - String langKey = locale.getLanguage(); - String country = locale.getCountry(); - // Only add country when available - in case of an overlay country is - // set to - // an empty value - if (StringHelper.containsNonWhitespace(country)) { - langKey = langKey + "_" + country; - } - String variant = locale.getVariant(); - // Only add the _ separator if the variant contains something in - // addition to - // the overlay, otherways use the __ only - if (StringHelper.containsNonWhitespace(variant)) { - if (variant.startsWith("__" + I18nModule.getOverlayName())) { - langKey += variant; - } else { - langKey = langKey + "_" + variant; + String key = localeToLocaleKey.get(locale); + if(key == null) { + String langKey = locale.getLanguage(); + String country = locale.getCountry(); + // Only add country when available - in case of an overlay country is + // set to + // an empty value + if (StringHelper.containsNonWhitespace(country)) { + langKey = langKey + "_" + country; + } + String variant = locale.getVariant(); + // Only add the _ separator if the variant contains something in + // addition to + // the overlay, otherways use the __ only + if (StringHelper.containsNonWhitespace(variant)) { + if (variant.startsWith("__" + I18nModule.getOverlayName())) { + langKey += variant; + } else { + langKey = langKey + "_" + variant; + } + } + + key = localeToLocaleKey.putIfAbsent(locale, langKey); + if(key == null) { + key = langKey; } + } - return langKey; + return key; } /**