Index: lams_admin/build.xml =================================================================== diff -u -rd94821a70e5de77dbe672ce502027283bd217e10 -r4d7c3f5641fd7081af1ed74a2d265242ad69551c --- lams_admin/build.xml (.../build.xml) (revision d94821a70e5de77dbe672ce502027283bd217e10) +++ lams_admin/build.xml (.../build.xml) (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -184,6 +184,7 @@ + Index: lams_admin/conf/language/ApplicationResources.properties =================================================================== diff -u -rbb95ab8738e05f5d338c56d9111d83fe00872d01 -r4d7c3f5641fd7081af1ed74a2d265242ad69551c --- lams_admin/conf/language/ApplicationResources.properties (.../ApplicationResources.properties) (revision bb95ab8738e05f5d338c56d9111d83fe00872d01) +++ lams_admin/conf/language/ApplicationResources.properties (.../ApplicationResources.properties) (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -215,6 +215,20 @@ sysadmin.library.activity.description =Description sysadmin.library.createtim =Create time sysadmin.function =Function +admin.importv1.title = Import LAMS 1 Users +msg.importv1.1 = Download +msg.importv1.2 = On the command line of your LAMS 1 database server, run the following command +msg.importv1.3a = Submit +msg.importv1.3b = using the form below. +msg.importv1.4 = You will be presented with a list of organisations and session classes to import. +label.importv1.integrated = Include integration users and organisations +label.continue = Continue +msg.importv1.found.users = Found {0} LAMS 1 users. +heading.importv1.users = Users +heading.importv1.account.organisations = Account Organisations +heading.importv1.session.classes = Session Classes +heading.importv1.sid = sid +msg.importv1.created = Created {0} users and {1} groups. +msg.importv1.already.exist = The following logins already exist - #======= End labels: Exported 209 labels for en AU ===== Index: lams_admin/conf/language/ApplicationResources_en_AU.properties =================================================================== diff -u -rbb95ab8738e05f5d338c56d9111d83fe00872d01 -r4d7c3f5641fd7081af1ed74a2d265242ad69551c --- lams_admin/conf/language/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision bb95ab8738e05f5d338c56d9111d83fe00872d01) +++ lams_admin/conf/language/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -215,6 +215,21 @@ sysadmin.library.activity.description =Description sysadmin.library.createtim =Create time sysadmin.function =Function +admin.importv1.title = Import LAMS 1 Users +msg.importv1.1 = Download +msg.importv1.2 = On the command line of your LAMS 1 database server, run the following command +msg.importv1.3a = Submit +msg.importv1.3b = using the form below. +msg.importv1.4 = You will be presented with a list of organisations and session classes to import. +label.importv1.integrated = Include integration users and organisations +label.continue = Continue +msg.importv1.found.users = Found {0} LAMS 1 users. +heading.importv1.users = Users +heading.importv1.account.organisations = Account Organisations +heading.importv1.session.classes = Session Classes +heading.importv1.sid = sid +msg.importv1.created = Created {0} users and {1} groups. +msg.importv1.already.exist = The following logins already exist #======= End labels: Exported 209 labels for en AU ===== Index: lams_admin/src/java/org/lamsfoundation/lams/admin/service/ISpreadsheetService.java =================================================================== diff -u -r35da7c79459d1e4ecc8a599e72abef1f5f8a69bf -r4d7c3f5641fd7081af1ed74a2d265242ad69551c --- lams_admin/src/java/org/lamsfoundation/lams/admin/service/ISpreadsheetService.java (.../ISpreadsheetService.java) (revision 35da7c79459d1e4ecc8a599e72abef1f5f8a69bf) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/service/ISpreadsheetService.java (.../ISpreadsheetService.java) (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -40,6 +40,7 @@ public static final String SEPARATOR = "|"; public static final String IMPORT_HELP_PAGE = "Import+Users"; + public static final String IMPORTV1_HELP_PAGE = "Import+LAMS+1+Users"; /** * Returns true if spreadsheet contains user data. @@ -66,6 +67,14 @@ public List parseSpreadsheet(FormFile fileItem) throws IOException; /** + * Returns list of V1 users and orgs after parsing the output of a mysql dump. + * @param fileItem + * @return + * @throws IOException + */ + public List parseV1UsersFile(FormFile fileItem, boolean includeIntegrated) throws IOException; + + /** * Returns message results from parsing list of users in spreadsheet. * @param file * @return Index: lams_admin/src/java/org/lamsfoundation/lams/admin/service/SpreadsheetService.java =================================================================== diff -u -r570bcc3eaf789d638c08cb96e0fec3e4a9ba6167 -r4d7c3f5641fd7081af1ed74a2d265242ad69551c --- lams_admin/src/java/org/lamsfoundation/lams/admin/service/SpreadsheetService.java (.../SpreadsheetService.java) (revision 570bcc3eaf789d638c08cb96e0fec3e4a9ba6167) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/service/SpreadsheetService.java (.../SpreadsheetService.java) (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -23,7 +23,9 @@ /* $Id$ */ package org.lamsfoundation.lams.admin.service; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -39,6 +41,9 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.admin.AdminConstants; +import org.lamsfoundation.lams.admin.web.dto.V1OrgRightDTO; +import org.lamsfoundation.lams.admin.web.dto.V1OrganisationDTO; +import org.lamsfoundation.lams.admin.web.dto.V1UserDTO; import org.lamsfoundation.lams.themes.CSSThemeVisualElement; import org.lamsfoundation.lams.usermanagement.AuthenticationMethod; import org.lamsfoundation.lams.usermanagement.Organisation; @@ -153,6 +158,134 @@ return new ArrayList(); } + public List parseV1UsersFile(FormFile fileItem, boolean includeIntegrated) throws IOException { + ArrayList users = new ArrayList(); + ArrayList orgs = new ArrayList(); + ArrayList results = new ArrayList(); + ArrayList integPrefixes = new ArrayList(); + ArrayList integOrgid = new ArrayList(); + BufferedReader reader = new BufferedReader(new InputStreamReader(fileItem.getInputStream())); + + // get username prefixes, for integrations on the lams 1 server + String line = reader.readLine(); + while (!line.startsWith("login\tpassword")) { + if (!line.startsWith("prefix")) { + String[] lineArray = line.split("\t"); + if (lineArray.length > 0) { + integPrefixes.add(lineArray[0]); + } + if (lineArray.length > 1) { + integOrgid.add(lineArray[1]); + } + } + line = reader.readLine(); + } + + // get user details + // login, password, fname, lname, email + line = reader.readLine(); // skip line containing column headings + while (!line.startsWith("sid\tname")) { + String[] userDetails = line.split("\t"); + line = reader.readLine(); + if (!includeIntegrated && isIntegratedUser(integPrefixes, userDetails[0])) { + continue; + } + V1UserDTO userDTO = new V1UserDTO( + userDetails[0], userDetails[1], userDetails[2], userDetails[3]); + if (userDetails.length > 4 && !StringUtils.equals(userDetails[4], "NULL")) { + userDTO.setEmail(userDetails[4]); + } + users.add(userDTO); + } + + // get organisations + // sid, name, description, account_organisation + line = reader.readLine(); + while (!line.startsWith("login\tg")) { + String[] orgDetails = line.split("\t"); + line = reader.readLine(); + if (orgDetails.length != 4) { + log.debug("LAMS 1 text file has troublesome organisation: "); + for (int i=0; i currentRoles = new ArrayList(); + String currentLogin = ""; + while (!line.startsWith("login\tsid")) { + String[] userRole = line.split("\t"); + line = reader.readLine(); + if (!includeIntegrated && isIntegratedUser(integPrefixes, userRole[0])) { + continue; + } + if (!StringUtils.equals(userRole[0], currentLogin)) { + if (!currentRoles.isEmpty()) { + int index = users.indexOf(new V1UserDTO(currentLogin)); + V1UserDTO userDTO = users.get(index); + userDTO.setRoleIds(new ArrayList(currentRoles)); + users.set(index, userDTO); + } + currentLogin = userRole[0]; + currentRoles.clear(); + } + currentRoles.add(userRole[1]); + } + int index = users.indexOf(new V1UserDTO(currentLogin)); + V1UserDTO userDTO = users.get(index); + userDTO.setRoleIds(new ArrayList(currentRoles)); + users.set(index, userDTO); + + // get user rights + // login, org id, right id + line = reader.readLine(); + while (line!=null) { + String[] userRight = line.split("\t"); + line = reader.readLine(); + if (!includeIntegrated && isIntegratedUser(integPrefixes, userRight[0])) { + continue; + } + V1OrgRightDTO orgRightDTO = new V1OrgRightDTO(userRight[1], userRight[2]); + index = users.indexOf(new V1UserDTO(userRight[0])); + userDTO = users.get(index); + List orgRights = userDTO.getOrgRights(); + if (orgRights==null) { + orgRights = new ArrayList(); + } + orgRights.add(orgRightDTO); + userDTO.setOrgRights(orgRights); + users.set(index, userDTO); + } + + results.add(users); + results.add(orgs); + + return results; + } + + private boolean isIntegratedUser(List integPrefixes, String login) { + int underscore = login.indexOf('_'); + if (underscore >= 0) { + if (integPrefixes.contains(login.substring(0, underscore))) { + return true; + } + } + return false; + } + public List parseUserSpreadsheet(FormFile fileItem) throws IOException { results = new ArrayList(); HSSFSheet sheet = getSheet(fileItem); @@ -411,13 +544,13 @@ } else { return null; } - log.debug("string cell value: "+cell.getStringCellValue().trim()); + //log.debug("string cell value: "+cell.getStringCellValue().trim()); return cell.getStringCellValue().trim(); } catch(Exception e) { cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); double d = cell.getNumericCellValue(); emptyRow = false; - log.debug("numeric cell value: "+d); + //log.debug("numeric cell value: "+d); return (new Long(new Double(d).longValue()).toString()); } } Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1Action.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1Action.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1Action.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,58 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $$Id$$ */ +package org.lamsfoundation.lams.admin.web.action; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.admin.web.form.ImportV1Form; + +/** + * @author jliew + * + * @struts:action path="/importv1" + * name="ImportV1Form" + * scope="request" + * validate="false" + * + * @struts:action-forward name="importv1" path=".importv1" + */ +public class ImportV1Action extends Action { + + public ActionForward execute(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + + ImportV1Form importV1Form = (ImportV1Form)form; + importV1Form.setIntegrated(false); + + return mapping.findForward("importv1"); + } + +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1ContentsAction.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1ContentsAction.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1ContentsAction.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,85 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.admin.web.action; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.admin.service.AdminServiceProxy; +import org.lamsfoundation.lams.admin.web.dto.V1OrganisationDTO; +import org.lamsfoundation.lams.admin.web.dto.V1UserDTO; +import org.lamsfoundation.lams.admin.web.form.ImportV1ContentsForm; +import org.lamsfoundation.lams.util.MessageService; + +/** + * @author jliew + * + * @struts:action path="/importv1contents" + * name="ImportV1ContentsForm" + * scope="session" + * validate="false" + * + * @struts:action-forward name="importv1contents" path=".importv1contents" + * @struts:action-forward name="sysadmin" path="/sysadminstart.do" + */ +public class ImportV1ContentsAction extends Action { + + private static Logger log = Logger.getLogger(ImportV1ContentsAction.class); + + public ActionForward execute(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + + ImportV1ContentsForm importV1ContentsForm = (ImportV1ContentsForm)form; + importV1ContentsForm.setOnlyMembers(true); + List users = (List)request.getAttribute("users"); + List orgs = (List)request.getAttribute("orgs"); + + // user and org data kept in session so we don't send it to the client + // unnecessarily as it can get quite large; danger is, if the client + // doesn't complete the form, i.e. click save or cancel, then these + // remain in session + request.getSession().setAttribute("users", users); + request.getSession().setAttribute("orgs", orgs); + + MessageService messageService = AdminServiceProxy + .getMessageService(getServlet().getServletContext()); + String[] args = new String[1]; + args[0] = String.valueOf(users.size()); + request.setAttribute("msgNumUsers", messageService + .getMessage("msg.importv1.found.users", args)); + request.setAttribute("numOrgs", orgs.size()); + + return mapping.findForward("importv1contents"); + } + +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1ContentsSaveAction.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1ContentsSaveAction.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1ContentsSaveAction.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,294 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.admin.web.action; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.admin.AdminConstants; +import org.lamsfoundation.lams.admin.service.AdminServiceProxy; +import org.lamsfoundation.lams.admin.web.dto.V1OrgRightDTO; +import org.lamsfoundation.lams.admin.web.dto.V1OrganisationDTO; +import org.lamsfoundation.lams.admin.web.dto.V1UserDTO; +import org.lamsfoundation.lams.admin.web.form.ImportV1ContentsForm; +import org.lamsfoundation.lams.themes.CSSThemeVisualElement; +import org.lamsfoundation.lams.usermanagement.AuthenticationMethod; +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.OrganisationState; +import org.lamsfoundation.lams.usermanagement.OrganisationType; +import org.lamsfoundation.lams.usermanagement.Role; +import org.lamsfoundation.lams.usermanagement.SupportedLocale; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; +import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; + +/** + * @author jliew + * + * @struts:action path="/importv1contentssave" + * name="ImportV1ContentsForm" + * input=".importv1contents" + * scope="session" + * validate="false" + * + * @struts:action-forward name="importv1result" path=".importv1result" + * @struts:action-forward name="sysadmin" path="/sysadminstart.do" + */ +public class ImportV1ContentsSaveAction extends Action { + + private static Logger log = Logger.getLogger(ImportV1ContentsSaveAction.class); + private static IUserManagementService service; + + public ActionForward execute(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + + if (isCancelled(request)) { + removeSessionVars(request); + return mapping.findForward("sysadmin"); + } + + service = AdminServiceProxy.getService(getServlet().getServletContext()); + // import data + List users = (List)request.getSession().getAttribute("users"); + List orgs = (List)request.getSession().getAttribute("orgs"); + removeSessionVars(request); + + // import options + ImportV1ContentsForm importV1ContentsForm = (ImportV1ContentsForm)form; + List orgSids = Arrays.asList(importV1ContentsForm.getOrgSids()); + List sessSids = Arrays.asList(importV1ContentsForm.getSessSids()); + boolean onlyMembers = importV1ContentsForm.getOnlyMembers(); + + // default import options + String defaultLocale = Configuration.get(ConfigurationKeys.SERVER_LANGUAGE); + SupportedLocale locale = service.getSupportedLocale(defaultLocale.substring(0,2),defaultLocale.substring(3)); + final OrganisationType courseType = (OrganisationType)service.findById( + OrganisationType.class, OrganisationType.COURSE_TYPE); + final OrganisationState activeState = (OrganisationState)service.findById( + OrganisationState.class, OrganisationState.ACTIVE); + Integer userID = ((UserDTO)SessionManager.getSession().getAttribute(AttributeNames.USER)).getUserID(); + + // import users + List alreadyExists = new ArrayList(); // users whose logins already exist + if (onlyMembers) { + List createdUsers = new ArrayList(); + for (V1UserDTO user : users) { + if (!isUserMember(user, orgSids, sessSids)) { + continue; + } + boolean created = createUser(user, locale); + if (!created) { + alreadyExists.add(user); + } else { + createdUsers.add(user); + } + } + users = createdUsers; + } else { + for (V1UserDTO user : users) { + boolean created = createUser(user, locale); + if (!created) { + alreadyExists.add(user); + } + } + } + + // import orgs + HashMap orgIdsMap = new HashMap(); // map v1 orgids to v2 orgids + for (V1OrganisationDTO org : orgs) { + if (StringUtils.equals(org.getAccountOrganisation(), "1")) { + if (!orgSids.contains(org.getSid())) { + continue; + } + } else if (StringUtils.equals(org.getAccountOrganisation(), "0")) { + if (!sessSids.contains(org.getSid())) { + continue; + } + } + Organisation v2org = createOrg(org, locale, courseType, activeState, userID); + orgIdsMap.put(org.getSid(), v2org.getOrganisationId()); + } + + // import user roles + for (V1UserDTO v1user : users) { + User user = service.getUserByLogin(v1user.getLogin()); + // special case for 'core' role, equivalent to global role of sysadmin + if (v1user.getRoleIds().contains(V1UserDTO.ROLE_CORE)) { + ArrayList roles = new ArrayList(); + roles.add(Role.ROLE_SYSADMIN.toString()); + service.setRolesForUserOrganisation(user, service.getRootOrganisation(), roles); + } + for (V1OrgRightDTO v1orgRight : v1user.getOrgRights()) { + // the org was not selected to be imported + if (orgIdsMap.get(v1orgRight.getOrgSid())==null) { + continue; + } + List roles = getV2RoleIds(v1user.getRoleIds(), v1orgRight); + Organisation org = (Organisation)service.findById(Organisation.class, orgIdsMap.get(v1orgRight.getOrgSid())); + service.setRolesForUserOrganisation(user, org, roles); + } + } + + MessageService messageService = AdminServiceProxy + .getMessageService(getServlet().getServletContext()); + String[] args = new String[2]; + args[0] = String.valueOf(users.size()); + args[1] = String.valueOf(orgIdsMap.size()); + request.setAttribute("msgNumCreated", messageService + .getMessage("msg.importv1.created", args)); + request.setAttribute("alreadyExists", alreadyExists); + + return mapping.findForward("importv1result"); + } + + // converts v1 roles/org rights to v2 roles. + private List getV2RoleIds(List roleIds, V1OrgRightDTO orgRight) { + List newRoleIds = new ArrayList(); + for (String roleId : roleIds) { + if (StringUtils.equals(roleId, V1UserDTO.ROLE_ADMINISTRATOR)) { + if (StringUtils.equals(orgRight.getUserRight(), V1OrgRightDTO.ADMIN)) { + newRoleIds.add(Role.ROLE_GROUP_ADMIN.toString()); + } + } else if (StringUtils.equals(roleId, V1UserDTO.ROLE_AUTHOR)) { + newRoleIds.add(Role.ROLE_AUTHOR.toString()); + } else if (StringUtils.equals(roleId, V1UserDTO.ROLE_STAFF)) { + if (!StringUtils.equals(orgRight.getUserRight(), V1OrgRightDTO.MEMBERSHIP)) { + newRoleIds.add(Role.ROLE_MONITOR.toString()); + } + } else if (StringUtils.equals(roleId, V1UserDTO.ROLE_LEARNER)) { + newRoleIds.add(Role.ROLE_LEARNER.toString()); + } + } + return newRoleIds; + } + + private void removeSessionVars(HttpServletRequest request) { + request.getSession().removeAttribute("users"); + request.getSession().removeAttribute("orgs"); + request.getSession().removeAttribute("ImportV1ContentsForm"); + } + + // make 'create user' audit log entry + private void createUserAuditLog(User user) { + String[] args = new String[2]; + args[0] = user.getLogin()+"("+user.getUserId()+")"; + args[1] = user.getFullName(); + String message = AdminServiceProxy.getMessageService(getServlet().getServletContext()) + .getMessage("audit.user.create", args); + AdminServiceProxy.getAuditService(getServlet().getServletContext()) + .log(AdminConstants.MODULE_NAME, message); + } + + private boolean createUser(V1UserDTO user, SupportedLocale locale) throws Exception { + // test username already exists + if (service.getUserByLogin(user.getLogin())!=null) { + return false; + } + + User newUser = new User(); + BeanUtils.copyProperties(newUser, user); + String flashName = Configuration.get(ConfigurationKeys.DEFAULT_FLASH_THEME); + List list = service.findByProperty(CSSThemeVisualElement.class, "name", flashName); + if (list!=null) { + CSSThemeVisualElement flashTheme = (CSSThemeVisualElement)list.get(0); + newUser.setFlashTheme(flashTheme); + } + String htmlName = Configuration.get(ConfigurationKeys.DEFAULT_HTML_THEME); + list = service.findByProperty(CSSThemeVisualElement.class, "name", htmlName); + if (list!=null) { + CSSThemeVisualElement htmlTheme = (CSSThemeVisualElement)list.get(0); + newUser.setHtmlTheme(htmlTheme); + } + newUser.setDisabledFlag(false); + newUser.setCreateDate(new Date()); + newUser.setAuthenticationMethod((AuthenticationMethod)service.findByProperty(AuthenticationMethod.class, + "authenticationMethodName","LAMS-Database").get(0)); + newUser.setUserId(null); + newUser.setLocale(locale); + service.save(newUser); + + createUserAuditLog(newUser); + return true; + } + + // is the user a member of one of the orgs to be imported + private boolean isUserMember(V1UserDTO user, List orgSids, List sessSids) { + List orgRights = user.getOrgRights(); + for (V1OrgRightDTO orgRight : orgRights) { + if (orgSids.contains(orgRight.getOrgSid()) || sessSids.contains(orgRight.getOrgSid())) { + return true; + } + } + return false; + } + + private Organisation createOrg(V1OrganisationDTO org, + SupportedLocale locale, + OrganisationType courseType, + OrganisationState activeState, + Integer userID) throws Exception { + // create the org + Organisation newOrg = new Organisation(); + BeanUtils.copyProperties(newOrg, org); + newOrg.setParentOrganisation(service.getRootOrganisation()); + newOrg.setOrganisationType(courseType); + newOrg.setOrganisationState(activeState); + newOrg.setLocale(locale); + newOrg = service.saveOrganisation(newOrg, userID); + createOrgAuditLog(newOrg); + return newOrg; + } + + // make 'create org' audit log entry + private void createOrgAuditLog(Organisation org) { + String[] args = new String[2]; + args[0] = org.getName()+"("+org.getOrganisationId()+")"; + args[1] = org.getOrganisationType().getName(); + String message = AdminServiceProxy.getMessageService(getServlet().getServletContext()) + .getMessage("audit.organisation.create", args); + AdminServiceProxy.getAuditService(getServlet().getServletContext()) + .log(AdminConstants.MODULE_NAME, message); + } +} + Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1SaveAction.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1SaveAction.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/ImportV1SaveAction.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,85 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $$Id$$ */ +package org.lamsfoundation.lams.admin.web.action; + +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.struts.upload.FormFile; +import org.lamsfoundation.lams.admin.service.AdminServiceProxy; +import org.lamsfoundation.lams.admin.service.ISpreadsheetService; +import org.lamsfoundation.lams.admin.web.dto.V1OrganisationDTO; +import org.lamsfoundation.lams.admin.web.dto.V1UserDTO; +import org.lamsfoundation.lams.admin.web.form.ImportV1Form; + +/** + * @author jliew + * + * @struts:action path="/importv1save" + * name="ImportV1Form" + * input=".importv1" + * scope="request" + * validate="false" + * + * @struts:action-forward name="importv1contents" path="/importv1contents.do" + * @struts:action-forward name="sysadmin" path="/sysadminstart.do" + */ +public class ImportV1SaveAction extends Action { + + private static Logger log = Logger.getLogger(ImportV1SaveAction.class); + + public ActionForward execute(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws Exception { + + if (isCancelled(request)) { + //return mapping.getInputForward(); + return mapping.findForward("sysadmin"); + } + + //MessageService messageService = AdminServiceProxy.getMessageService(getServlet().getServletContext()); + ISpreadsheetService spreadsheetService = AdminServiceProxy.getSpreadsheetService(getServlet().getServletContext()); + ImportV1Form importV1Form = (ImportV1Form)form; + FormFile file = importV1Form.getFile(); + boolean includeIntegrated = importV1Form.getIntegrated(); + + List results = spreadsheetService.parseV1UsersFile(file, includeIntegrated); + List users = results.get(0); + List orgs = results.get(1); + + request.setAttribute("users", users); + request.setAttribute("orgs", orgs); + + return mapping.findForward("importv1contents"); + } + +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SysAdminStartAction.java =================================================================== diff -u -r3f5083ee75c913e287cd44cc93653c1b5012a64b -r4d7c3f5641fd7081af1ed74a2d265242ad69551c --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SysAdminStartAction.java (.../SysAdminStartAction.java) (revision 3f5083ee75c913e287cd44cc93653c1b5012a64b) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/action/SysAdminStartAction.java (.../SysAdminStartAction.java) (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -66,6 +66,8 @@ links.add(linkBean); linkBean = new LinkBean("importexcel.do", "admin.user.import"); links.add(linkBean); + linkBean = new LinkBean("importv1.do", "admin.importv1.title"); + links.add(linkBean); linkBean = new LinkBean("disabledmanage.do", "admin.list.disabled.users"); links.add(linkBean); linkBean = new LinkBean("loginmaintain.do", "sysadmin.maintain.loginpage"); @@ -84,6 +86,8 @@ links.add(linkBean); linkBean = new LinkBean("importexcel.do", "admin.user.import"); links.add(linkBean); + linkBean = new LinkBean("importv1.do", "admin.importv1.title"); + links.add(linkBean); linkBean = new LinkBean("disabledmanage.do", "admin.list.disabled.users"); links.add(linkBean); } else { Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1OrgRightDTO.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1OrgRightDTO.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1OrgRightDTO.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,59 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.admin.web.dto; + +/** + * @author jliew + * + */ +public class V1OrgRightDTO { + + private String orgSid; + private String user_right; + + public static final String MEMBERSHIP = "0"; + public static final String SELECTION = "1"; + public static final String ADMIN = "2"; + + public V1OrgRightDTO(String orgSid, String user_right) { + this.orgSid = orgSid; + this.user_right = user_right; + } + + public String getOrgSid() { + return orgSid; + } + + public void setOrgSid(String orgSid) { + this.orgSid = orgSid; + } + + public String getUserRight() { + return user_right; + } + + public void setUserRight(String user_right) { + this.user_right = user_right; + } +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1OrganisationDTO.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1OrganisationDTO.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1OrganisationDTO.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,78 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.admin.web.dto; + +/** + * @author jliew + * + */ +public class V1OrganisationDTO { + + private String sid; + private String name; + private String description; + private String account_organisation; + + public V1OrganisationDTO() { + } + + public V1OrganisationDTO(String sid, String name, String description, String account_organisation) { + this.sid = sid; + this.name = name; + this.description = description; + this.account_organisation = account_organisation; + } + + public String getSid() { + return sid; + } + + public void setSid(String sid) { + this.sid = sid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getAccountOrganisation() { + return account_organisation; + } + + public void setAccountOrganisation(String account_organisation) { + this.account_organisation = account_organisation; + } +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1UserDTO.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1UserDTO.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/dto/V1UserDTO.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,134 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.admin.web.dto; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; + +/** + * @author jliew + * + */ +public class V1UserDTO { + + private String login; + private String password; + private String firstName; + private String lastName; + private String email; + private List roleIds; + private List orgRights; + + public static final String ROLE_ANONYMOUS = "0"; + public static final String ROLE_ADMINISTRATOR = "1"; + public static final String ROLE_CORE = "2"; + public static final String ROLE_LEARNER = "3"; + public static final String ROLE_STAFF = "4"; + public static final String ROLE_AUTHOR = "5"; + + public V1UserDTO() { + } + + public V1UserDTO(String login) { + this.login = login; + } + + public V1UserDTO(String login, String password, String firstName, String lastName) { + this.login = login; + this.password = password; + this.firstName = firstName; + this.lastName = lastName; + } + + public int getRolesSize() { + return roleIds.size(); + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public List getRoleIds() { + return roleIds; + } + + public void setRoleIds(List roleIds) { + this.roleIds = roleIds; + } + + public List getOrgRights() { + return orgRights; + } + + public void setOrgRights(List orgRights) { + this.orgRights = orgRights; + } + + public boolean equals(Object userDTO) { + if (userDTO instanceof V1UserDTO) { + String login = ((V1UserDTO)userDTO).getLogin(); + if (StringUtils.equals(login, this.login)) { + return true; + } + } + return false; + } +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/form/ImportV1ContentsForm.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/form/ImportV1ContentsForm.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/form/ImportV1ContentsForm.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,63 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.admin.web.form; + +import org.apache.struts.action.ActionForm; + +/** + * @author jliew + * + * @struts.form name="ImportV1ContentsForm" + */ +public class ImportV1ContentsForm extends ActionForm { + + private String[] orgSids; + private String[] sessSids; + private boolean onlyMembers; + + public String[] getOrgSids() { + return orgSids; + } + + public void setOrgSids(String[] orgSids) { + this.orgSids = orgSids; + } + + public String[] getSessSids() { + return sessSids; + } + + public void setSessSids(String[] sessSids) { + this.sessSids = sessSids; + } + + public boolean getOnlyMembers() { + return onlyMembers; + } + + public void setOnlyMembers(boolean onlyMembers) { + this.onlyMembers = onlyMembers; + } + +} Index: lams_admin/src/java/org/lamsfoundation/lams/admin/web/form/ImportV1Form.java =================================================================== diff -u --- lams_admin/src/java/org/lamsfoundation/lams/admin/web/form/ImportV1Form.java (revision 0) +++ lams_admin/src/java/org/lamsfoundation/lams/admin/web/form/ImportV1Form.java (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,55 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $$Id$$ */ +package org.lamsfoundation.lams.admin.web.form; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.upload.FormFile; + +/** + * @author jliew + * + * @struts.form name="ImportV1Form" + */ +public class ImportV1Form extends ActionForm { + + private FormFile file; + private boolean integrated; + + public FormFile getFile() { + return file; + } + + public void setFile(FormFile file) { + this.file = file; + } + + public boolean getIntegrated() { + return integrated; + } + + public void setIntegrated(boolean integrated) { + this.integrated = integrated; + } + +} Index: lams_admin/web/WEB-INF/tiles/tiles-defs.xml =================================================================== diff -u -r3f5083ee75c913e287cd44cc93653c1b5012a64b -r4d7c3f5641fd7081af1ed74a2d265242ad69551c --- lams_admin/web/WEB-INF/tiles/tiles-defs.xml (.../tiles-defs.xml) (revision 3f5083ee75c913e287cd44cc93653c1b5012a64b) +++ lams_admin/web/WEB-INF/tiles/tiles-defs.xml (.../tiles-defs.xml) (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -1,6 +1,21 @@ + + + + + + + + + + + + + + + Index: lams_admin/web/file/lams1_user_org_export.sql =================================================================== diff -u --- lams_admin/web/file/lams1_user_org_export.sql (revision 0) +++ lams_admin/web/file/lams1_user_org_export.sql (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,21 @@ +# LAMS 1 integrated server prefixes and orgs +select prefix, orgid from ext_server_org_map; +# LAMS 1 user dump +select tu.login,tu.password,tu.fname,tu.lname,tud.email +from tbl_user tu, tbl_user_detail tud +where tu.uid=tud.uid; +# LAMS 1 organisations dump +select sid,name,description,account_organisation +from u_organisation +where visible=1; +# LAMS 1 user roles dump +select tu.login, tug.gid +from tbl_user tu, tbl_user_group tug +where tu.uid=tug.uid +order by tu.login; +# LAMS 1 user rights dump +select tu.login, uo.sid, uuo.user_right +from tbl_user tu, u_organisation uo, u_user_organisation uuo +where tu.uid=uuo.user_id +and uuo.organisation_id=uo.sid +order by tu.login; \ No newline at end of file Index: lams_admin/web/import/importv1.jsp =================================================================== diff -u --- lams_admin/web/import/importv1.jsp (revision 0) +++ lams_admin/web/import/importv1.jsp (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,43 @@ +<%@ include file="/taglibs.jsp"%> +<%@ page import="org.lamsfoundation.lams.admin.service.ISpreadsheetService" %> + +

+ + : +

+ + + +

 

+ +

+

    +
  1. lams1_user_org_export.sql.
  2. +
  3. : +

    shell> mysql lamsone < lams1_user_org_export.sql -u root -p > lams1_users_orgs.txt

    +
  4. +
  5. lams1_users_orgs.txt    +
  6. +
+

+ +

 

+ + + + + + + + + + + + +
lams1_users_orgs.txt: 
 
+

+   + +

+ +
\ No newline at end of file Index: lams_admin/web/import/importv1contents.jsp =================================================================== diff -u --- lams_admin/web/import/importv1contents.jsp (revision 0) +++ lams_admin/web/import/importv1contents.jsp (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,80 @@ +<%@ include file="/taglibs.jsp"%> + +

+ + : +

+ +

 

+ + + +

+ + + + +

+

+ + + + + + + + + + + + + + + +
sid
+ +

+ + + + + + + + + + + + + + + +
sid
+

+ +

+ Only import users that are members of organisations/session classes to be imported +

+ +

+ + + + +

+ +
\ No newline at end of file Index: lams_admin/web/import/importv1result.jsp =================================================================== diff -u --- lams_admin/web/import/importv1result.jsp (revision 0) +++ lams_admin/web/import/importv1result.jsp (revision 4d7c3f5641fd7081af1ed74a2d265242ad69551c) @@ -0,0 +1,34 @@ +<%@ include file="/taglibs.jsp"%> + +

+ + : +

+ +

 

+ +

+ +

+ + +

+: + + + + + + + + + + + + + + + + +
+