diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep00.java b/src/main/java/org/olat/admin/user/imp/ImportStep00.java index 08035ceaee8bd5ae966467d2f4bd1d433936afc0..0d63539dbf0bd001ed49d593f2e176ee3c574f8a 100644 --- a/src/main/java/org/olat/admin/user/imp/ImportStep00.java +++ b/src/main/java/org/olat/admin/user/imp/ImportStep00.java @@ -110,8 +110,8 @@ class ImportStep00 extends BasicStep { private FormLayoutContainer textContainer; private List<UserPropertyHandler> userPropertyHandlers; - private ArrayList<List<String>> newIdents; - private List<Object> idents; + private List<TransientIdentity> newIdents; + private List<Identity> idents; public ImportStepForm00(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) { super(ureq, control, rootForm, runContext, LAYOUT_VERTICAL, null); @@ -147,8 +147,8 @@ class ImportStep00 extends BasicStep { boolean importDataError = false; - idents = new ArrayList<Object>(); - newIdents = new ArrayList<List<String>>(); + idents = new ArrayList<Identity>(); + newIdents = new ArrayList<TransientIdentity>(); // fxdiff: check also emails in change-workflow, see OLAT-5723 Set<String> tempEmailsInUse = new HashSet<String>(); RegistrationManager rm = RegistrationManager.getInstance(); @@ -254,21 +254,20 @@ class ImportStep00 extends BasicStep { String thisKey = ""; String thisValue = ""; // check that no user with same login name is already in list - for (Iterator<List<String>> it_news = newIdents.iterator(); it_news.hasNext();) { - List<String> singleUser = it_news.next(); - if (singleUser.get(1).equalsIgnoreCase(login)) { + for (Iterator<TransientIdentity> it_news = newIdents.iterator(); it_news.hasNext();) { + TransientIdentity singleUser = it_news.next(); + if (singleUser.getName().equalsIgnoreCase(login)) { textAreaElement.setErrorKey("error.login.douplicate", new String[] { String.valueOf(i + 1), login }); importDataError = true; break; } } - List<String> ud = new ArrayList<String>(); + TransientIdentity ud = new TransientIdentity(); // insert fix fields: login, pwd, lang from above - ud.add("false"); // used for first column in model (user existing) - ud.add(login); - ud.add(pwd); - ud.add(lang); + ud.setName(login); + ud.setPassword(pwd); + ud.setLanguage(lang); for (int j = 0; j < userPropertyHandlers.size(); j++) { userPropertyHandler = userPropertyHandlers.get(j); @@ -326,7 +325,7 @@ class ImportStep00 extends BasicStep { importedEmails.add(thisValue); } } - ud.add(thisValue); + ud.setProperty(thisKey, thisValue); columnId++; } idents.add(ud); diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep01.java b/src/main/java/org/olat/admin/user/imp/ImportStep01.java index 13a523065090de0d6efb14aee3a797f2a35562a2..8a34b2070384812a6fe17e06c766f9c5d3ede8da 100644 --- a/src/main/java/org/olat/admin/user/imp/ImportStep01.java +++ b/src/main/java/org/olat/admin/user/imp/ImportStep01.java @@ -24,7 +24,6 @@ */ package org.olat.admin.user.imp; -import java.util.ArrayList; import java.util.List; import org.olat.core.gui.UserRequest; @@ -47,6 +46,7 @@ import org.olat.core.gui.control.generic.wizard.StepFormController; import org.olat.core.gui.control.generic.wizard.StepsEvent; import org.olat.core.gui.control.generic.wizard.StepsRunContext; import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; @@ -80,8 +80,8 @@ class ImportStep01 extends BasicStep { } private final class ImportStepForm01 extends StepFormBasicController { - private ArrayList<List<String>> newIdents; - private List<Object> idents; + private List<TransientIdentity> newIdents; + private List<Identity> idents; private FormLayoutContainer textContainer; private List<UserPropertyHandler> userPropertyHandlers; @@ -110,8 +110,8 @@ class ImportStep01 extends BasicStep { FormLayoutContainer formLayoutVertical = FormLayoutContainer.createVerticalFormLayout("vertical", getTranslator()); formLayout.add(formLayoutVertical); - idents = (List<Object>) getFromRunContext("idents"); - newIdents = (ArrayList<List<String>>) getFromRunContext("newIdents"); + idents = (List<Identity>) getFromRunContext("idents"); + newIdents = (List<TransientIdentity>) getFromRunContext("newIdents"); textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), this.velocity_root + "/step1.html"); formLayoutVertical.add(textContainer); @@ -146,12 +146,9 @@ class ImportStep01 extends BasicStep { tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos++)); } - - FlexiTableDataModel tableDataModel = new FlexiTableDataModelImpl(new Model(idents, colPos), tableColumnModel); + FlexiTableDataModel<Identity> tableDataModel = new FlexiTableDataModelImpl<Identity>(new Model(idents, colPos), tableColumnModel); uifactory.addTableElement(ureq, getWindowControl(), "newUsers", tableDataModel, formLayoutVertical); - } - } } diff --git a/src/main/java/org/olat/admin/user/imp/Model.java b/src/main/java/org/olat/admin/user/imp/Model.java index bbd7c4f1af2ecc8cd3d3ededfe55348368d0f165..f2ccdb5904f1b4ccd8ff24a2cb45d4417d03af51 100644 --- a/src/main/java/org/olat/admin/user/imp/Model.java +++ b/src/main/java/org/olat/admin/user/imp/Model.java @@ -39,63 +39,53 @@ import org.olat.user.propertyhandlers.UserPropertyHandler; * * Description: Table model for user mass import. */ -public class Model extends DefaultTableDataModel<Object> { +public class Model extends DefaultTableDataModel<Identity> { private List<UserPropertyHandler> userPropertyHandlers; private static final String usageIdentifyer = UserImportController.class.getCanonicalName(); private int columnCount = 0; - public Model(List<Object> objects, int columnCount) { + public Model(List<Identity> objects, int columnCount) { super(objects); userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, true); this.columnCount = columnCount; } + @Override public int getColumnCount() { return columnCount; } + @Override public Object getValueAt(int row, int col) { - Identity ident = null; - List<String> userArray = null; - boolean userExists = false; - Object o = getObject(row); - if (o instanceof Identity) { - ident = (Identity) o; - userExists = true; - } else { - userArray = (List<String>) o; - } + Identity ident = getObject(row); + boolean userExists = !(ident instanceof TransientIdentity); if (col == 0) { // existing return (userExists ? Boolean.FALSE : Boolean.TRUE); } - if (col == 1) { return (userExists ? ident.getName() : userArray.get(col)); } + if (col == 1) { + return ident.getName(); + } if (col == 2) {// pwd if (userExists) { return "-"; } else { - return (userArray.get(col) == null ? "-" : "***"); + return (((TransientIdentity)ident).getPassword() == null ? "-" : "***"); } } else if (col == 3) {// lang if (userExists) { return ident.getUser().getPreferences().getLanguage(); } else { - return userArray.get(col); + return ((TransientIdentity)ident).getLanguage(); } } else if (col > 3 && col < getColumnCount()) { - if (userExists) { - // get user property for this column for an already existing user - UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(col - 4); - String value = userPropertyHandler.getUserProperty(ident.getUser(), getLocale()); - return (value == null ? "n/a" : value); - } else { - return userArray.get(col); - } - } - + // get user property for this column for an already existing user + UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(col - 4); + String value = userPropertyHandler.getUserProperty(ident.getUser(), getLocale()); + return (value == null ? "n/a" : value); + } return "ERROR"; - } } diff --git a/src/main/java/org/olat/admin/user/imp/TransientIdentity.java b/src/main/java/org/olat/admin/user/imp/TransientIdentity.java new file mode 100644 index 0000000000000000000000000000000000000000..868905facd45ac2f99baa8e26d6b1da3b7207742 --- /dev/null +++ b/src/main/java/org/olat/admin/user/imp/TransientIdentity.java @@ -0,0 +1,146 @@ +/** + * <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.user.imp; + +import java.util.Date; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import org.olat.core.id.Identity; +import org.olat.core.id.Persistable; +import org.olat.core.id.Preferences; +import org.olat.core.id.User; + +/** + * A transient implementation of Identity + * + * Initial date: 08.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class TransientIdentity implements Identity, User { + private static final long serialVersionUID = 1394807800521540930L; + + private String login; + private String password; + private String language; + + private Map<String, String> properties = new HashMap<String,String>(); + + @Override + public Date getCreationDate() { + return null; + } + + @Override + public Long getKey() { + return null; + } + + + @Override + public String getName() { + return login; + } + + @Override + public void setName(String name) { + this.login = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + @Override + public User getUser() { + return this; + } + + @Override + public Date getLastLogin() { + return null; + } + + @Override + public void setLastLogin(Date loginDate) { + // + } + + @Override + public Integer getStatus() { + return null; + } + + @Override + public void setStatus(Integer newStatus) { + // + } + + + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return super.equals(persistable); + } + + @Override + public Preferences getPreferences() { + return null; + } + + @Override + public void setPreferences(Preferences prefs) { + // + } + + @Override + public void setProperty(String propertyName, String propertyValue) { + properties.put(propertyName, propertyValue); + } + + @Override + public String getProperty(String propertyName, Locale locale) { + return properties.get(propertyName); + } + + @Override + public void setIdentityEnvironmentAttributes(Map<String, String> identEnvAttribs) { + // + } + + @Override + public String getPropertyOrIdentityEnvAttribute(String propertyName, Locale locale) { + return null; + } +} diff --git a/src/main/java/org/olat/admin/user/imp/UserImportController.java b/src/main/java/org/olat/admin/user/imp/UserImportController.java index 314ceb647569aa6e96e12d58577f126be3802e49..cd06ab1ed161993ba29d55764f2d4808b7ff997d 100644 --- a/src/main/java/org/olat/admin/user/imp/UserImportController.java +++ b/src/main/java/org/olat/admin/user/imp/UserImportController.java @@ -28,7 +28,6 @@ package org.olat.admin.user.imp; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Set; @@ -112,11 +111,11 @@ public class UserImportController extends BasicController { } } - private Identity doCreateAndPersistIdentity(List<String> singleUser) { + private Identity doCreateAndPersistIdentity(TransientIdentity singleUser) { // Create new user and identity and put user to users group - String login = singleUser.get(1); //pos 0 is used for existing/non-existing user flag - String pwd = singleUser.get(2); - String lang = singleUser.get(3); + String login = singleUser.getName(); //pos 0 is used for existing/non-existing user flag + String pwd = singleUser.getPassword(); + String lang = singleUser.getLanguage(); // use password only when configured to do so if (canCreateOLATPassword) { @@ -132,13 +131,10 @@ public class UserImportController extends BasicController { User newUser = um.createUser(null, null, null); List<UserPropertyHandler> userProperties = userPropertyHandlers; - int col = 4; - String thisValue = "", stringValue; for (UserPropertyHandler userPropertyHandler : userProperties) { - thisValue = singleUser.get(col); - stringValue = userPropertyHandler.getStringValue(thisValue, getLocale()); + String thisValue = singleUser.getProperty(userPropertyHandler.getName(), null); + String stringValue = userPropertyHandler.getStringValue(thisValue, getLocale()); userPropertyHandler.setUserProperty(newUser, stringValue); - col++; } // Init preferences newUser.getPreferences().setLanguage(lang); @@ -172,10 +168,9 @@ public class UserImportController extends BasicController { if (runContext.containsKey("validImport") && ((Boolean) runContext.get("validImport")).booleanValue()) { // create new users and persist @SuppressWarnings("unchecked") - List<List<String>> newIdents = (List<List<String>>) runContext.get("newIdents"); - for (Iterator<List<String>> it_news = newIdents.iterator(); it_news.hasNext();) { - List<String> singleUser = it_news.next(); - doCreateAndPersistIdentity(singleUser); + List<TransientIdentity> newIdents = (List<TransientIdentity>) runContext.get("newIdents"); + for (TransientIdentity newIdent:newIdents) { + doCreateAndPersistIdentity(newIdent); } @SuppressWarnings("unchecked") @@ -185,7 +180,7 @@ public class UserImportController extends BasicController { if (ownGroups.size() > 0 || partGroups.size() > 0){ @SuppressWarnings("unchecked") - List<Object> allIdents = (List<Object>) runContext.get("idents"); + List<Identity> allIdents = (List<Identity>) runContext.get("idents"); Boolean sendMailObj = (Boolean)runContext.get("sendMail"); boolean sendmail = sendMailObj == null ? true : sendMailObj.booleanValue(); processGroupAdditionForAllIdents(allIdents, ownGroups, partGroups, sendmail); @@ -208,16 +203,15 @@ public class UserImportController extends BasicController { } } - private Collection<Identity> getIdentities(List<Object> allIdents) { + private Collection<Identity> getIdentities(List<Identity> allIdents) { Set<Identity> identities = new HashSet<Identity>(allIdents.size()); List<String> usernames = new ArrayList<String>(); for (Object o : allIdents) { - if (o instanceof Identity) { + if(o instanceof TransientIdentity) { + TransientIdentity transIdent = (TransientIdentity)o; + usernames.add(transIdent.getName()); + } else if (o instanceof Identity) { identities.add((Identity)o); - } else if(o instanceof List) { - @SuppressWarnings("unchecked") - List<String> userArray = (List<String>) o; - usernames.addAll(userArray); } } @@ -226,7 +220,7 @@ public class UserImportController extends BasicController { return identities; } - private void processGroupAdditionForAllIdents(List<Object> allIdents, List<Long> tutorGroups, List<Long> partGroups, boolean sendmail) { + private void processGroupAdditionForAllIdents(List<Identity> allIdents, List<Long> tutorGroups, List<Long> partGroups, boolean sendmail) { Collection<Identity> identities = getIdentities(allIdents); List<BusinessGroupMembershipChange> changes = new ArrayList<BusinessGroupMembershipChange>(); for(Identity identity:identities) { diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AbstractTextElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AbstractTextElement.java index 9bd5c873e522a19f67da2ee4db1f9fede61881cf..1db642be235ebec69afb5b2c6eafed35f5f9aa0a 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AbstractTextElement.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/AbstractTextElement.java @@ -36,7 +36,6 @@ import org.olat.core.gui.components.form.flexible.impl.FormItemImpl; import org.olat.core.util.ValidationStatus; import org.olat.core.util.ValidationStatusImpl; import org.olat.core.util.filter.Filter; -import org.olat.core.util.filter.FilterFactory; /** * Description:<br> @@ -127,14 +126,15 @@ public abstract class AbstractTextElement extends FormItemImpl implements TextEl /** * @see org.olat.core.gui.components.form.flexible.elements.TextElement#getValue() */ + @Override public String getValue() { - Filter xssFilter = FilterFactory.getXSSFilterForTextField(value.length() + 1); - return getValue(xssFilter); + return value; } /** * @see org.olat.core.gui.components.form.flexible.elements.TextElement#getValue(org.olat.core.util.filter.Filter) */ + @Override public String getValue(Filter filter) { return filter.filter(value); } diff --git a/src/main/java/org/olat/user/AbstractUserPropertyHandler.java b/src/main/java/org/olat/user/AbstractUserPropertyHandler.java index 87e55026b2a0209556230a47145fa0c47eff1739..f5de71af0a649360aa3bbe51f93c73a1cfc8d310 100644 --- a/src/main/java/org/olat/user/AbstractUserPropertyHandler.java +++ b/src/main/java/org/olat/user/AbstractUserPropertyHandler.java @@ -120,12 +120,14 @@ public abstract class AbstractUserPropertyHandler implements UserPropertyHandler * @return The non-i18-ified raw value from the database */ protected String getInternalValue(User user) { - if (user != null) { + if (user instanceof UserImpl) { String value = ((UserImpl)user).getProperties().get(name); if("_".equals(value) && "oracle".equals(DBFactory.getInstance().getDbVendor())) { value = null; } return value; + } else if (user instanceof User) { + return user.getProperty(name, null); } return null; } @@ -134,7 +136,7 @@ public abstract class AbstractUserPropertyHandler implements UserPropertyHandler * @param value The raw value in a 18n independent form */ protected void setInternalValue(User user, String value) { - if (user != null) { + if (user instanceof UserImpl) { // remove fields with null or empty value from o_userfield table (hibernate) // sparse data storage if (value == null || value.length() == 0) { @@ -147,6 +149,8 @@ public abstract class AbstractUserPropertyHandler implements UserPropertyHandler } else { ((UserImpl)user).getProperties().put(name, value); } + } else if (user instanceof UserImpl) { + user.setProperty(name, value); } }