/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.workplace.tools.accounts; import org.opencms.i18n.CmsEncoder; import org.opencms.jsp.CmsJspActionElement; import org.opencms.main.CmsIllegalArgumentException; import org.opencms.main.CmsRuntimeException; import org.opencms.util.CmsRequestUtil; import org.opencms.util.CmsStringUtil; import org.opencms.util.CmsXsltUtil; import org.opencms.widgets.CmsGroupWidget; import org.opencms.widgets.CmsHttpUploadWidget; import org.opencms.widgets.CmsInputWidget; import org.opencms.widgets.CmsSelectWidget; import org.opencms.workplace.CmsDialog; import org.opencms.workplace.CmsWidgetDialogParameter; import org.opencms.workplace.CmsWorkplaceSettings; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; import org.apache.commons.fileupload.FileItem; /** * Dialog to import user data.<p> * * @since 6.5.6 */ public class CmsUserDataImportDialog extends A_CmsUserDataImexportDialog { /** localized messages Keys prefix. */ public static final String KEY_PREFIX = "userdata.import"; /** The path to the file to import. */ private String m_importFile; /** The password to use in the import. */ private String m_password; /** * Public constructor with JSP action element.<p> * * @param jsp an initialized JSP action element */ public CmsUserDataImportDialog(CmsJspActionElement jsp) { super(jsp); } /** * Public constructor with JSP variables.<p> * * @param context the JSP page context * @param req the JSP request * @param res the JSP response */ public CmsUserDataImportDialog(PageContext context, HttpServletRequest req, HttpServletResponse res) { this(new CmsJspActionElement(context, req, res)); } /** * @see org.opencms.workplace.tools.accounts.A_CmsUserDataImexportDialog#actionCommit() */ public void actionCommit() throws IOException, ServletException { List errors = new ArrayList(); // get the file item from the multipart request Iterator it = getMultiPartFileItems().iterator(); FileItem fi = null; while (it.hasNext()) { fi = (FileItem)it.next(); if (fi.getName() != null) { // found the file object, leave iteration break; } else { // this is no file object, check next item continue; } } if (fi != null && CmsStringUtil.isNotEmptyOrWhitespaceOnly(fi.getName())) { byte[] content = fi.get(); File importFile = File.createTempFile("import_users", ".csv"); m_importFile = importFile.getAbsolutePath(); FileOutputStream fileOutput = new FileOutputStream(importFile); fileOutput.write(content); fileOutput.close(); fi.delete(); FileReader fileReader = new FileReader(importFile); BufferedReader bufferedReader = new BufferedReader(fileReader); String line = bufferedReader.readLine(); if (line != null) { List colDefs = CmsStringUtil.splitAsList(line, CmsXsltUtil.getPreferredDelimiter(line)); if (!colDefs.contains("name")) { errors.add(new CmsRuntimeException(Messages.get().container( Messages.ERR_USERDATA_IMPORT_CSV_MISSING_NAME_0))); } if ((line.indexOf("password") == -1) && CmsStringUtil.isEmptyOrWhitespaceOnly(m_password)) { errors.add(new CmsRuntimeException(Messages.get().container( Messages.ERR_USERDATA_IMPORT_CSV_MISSING_PASSWORD_0))); } } bufferedReader.close(); } else { errors.add(new CmsIllegalArgumentException(Messages.get().container( Messages.ERR_USERDATA_IMPORT_NO_CONTENT_0))); } if (errors.isEmpty()) { Map params = new HashMap(); params.put("groups", CmsStringUtil.collectionAsString(getGroups(), ",")); params.put("roles", CmsStringUtil.collectionAsString(getRoles(), ",")); params.put("importfile", m_importFile); params.put("password", m_password); params.put(A_CmsOrgUnitDialog.PARAM_OUFQN, getParamOufqn()); // set action parameter to initial dialog call params.put(CmsDialog.PARAM_ACTION, CmsDialog.DIALOG_INITIAL); getToolManager().jspForwardTool(this, getCurrentToolPath() + "/list", params); } // set the list of errors to display when something goes wrong setCommitErrors(errors); } /** * @see org.opencms.workplace.CmsWidgetDialog#dialogButtonsCustom() */ public String dialogButtonsCustom() { StringBuffer result = new StringBuffer(256); result.append(dialogButtonRow(HTML_START)); result.append("<input name=\"ok\" value=\""); result.append(key(org.opencms.workplace.Messages.GUI_DIALOG_BUTTON_CONTINUE_0) + "\""); result.append(" type=\"submit\""); result.append(" class=\"dialogbutton\""); result.append(">\n"); dialogButtonsHtml(result, BUTTON_CANCEL, ""); result.append(dialogButtonRow(HTML_END)); return result.toString(); } /** * Returns the path of the file to import.<p> * * @return the path of the file to import */ public String getImportFile() { return m_importFile; } /** * Returns the password to set during import.<p> * * @return the password to set during import */ public String getPassword() { return m_password; } /** * Sets the path of the import file.<p> * * @param importFile the import file path */ public void setImportFile(String importFile) { m_importFile = importFile; } /** * Sets the password to use during import.<p> * * @param password the password to use during import */ public void setPassword(String password) { m_password = password; } /** * Creates the dialog HTML for all defined widgets of the named dialog (page).<p> * * This overwrites the method from the super class to create a layout variation for the widgets.<p> * * @param dialog the dialog (page) to get the HTML for * @return the dialog HTML for all defined widgets of the named dialog (page) */ protected String createDialogHtml(String dialog) { StringBuffer result = new StringBuffer(1024); result.append(createWidgetTableStart()); // show error header once if there were validation errors result.append(createWidgetErrorHeader()); if (dialog.equals(PAGES[0])) { // create the widgets for the first dialog page result.append(dialogBlockStart(key(Messages.GUI_USERDATA_IMPORT_LABEL_HINT_BLOCK_0))); result.append(key(Messages.GUI_USERDATA_IMPORT_LABEL_HINT_TEXT_0)); result.append(dialogBlockEnd()); result.append(dialogBlockStart(key(Messages.GUI_USERDATA_IMPORT_LABEL_DATA_BLOCK_0))); result.append(createWidgetTableStart()); result.append(createDialogRowsHtml(0, 3)); result.append(createWidgetTableEnd()); result.append(dialogBlockEnd()); } result.append(createWidgetTableEnd()); return result.toString(); } /** * @see org.opencms.workplace.CmsWidgetDialog#defaultActionHtmlContent() */ protected String defaultActionHtmlContent() { StringBuffer result = new StringBuffer(2048); result.append("<form name=\"EDITOR\" id=\"EDITOR\" method=\"post\" action=\"").append(getDialogRealUri()); result.append("\" class=\"nomargin\" onsubmit=\"return submitAction('").append(DIALOG_OK).append( "', null, 'EDITOR');\" enctype=\"multipart/form-data\">\n"); result.append(dialogContentStart(getDialogTitle())); result.append(buildDialogForm()); result.append(dialogContentEnd()); result.append(dialogButtonsCustom()); result.append(paramsAsHidden()); if (getParamFramename() == null) { result.append("\n<input type=\"hidden\" name=\"").append(PARAM_FRAMENAME).append("\" value=\"\">\n"); } result.append("</form>\n"); result.append(getWidgetHtmlEnd()); return result.toString(); } /** * @see org.opencms.workplace.tools.accounts.A_CmsUserDataImexportDialog#defineWidgets() */ protected void defineWidgets() { initImportObject(); setKeyPrefix(KEY_PREFIX); addWidget(new CmsWidgetDialogParameter( this, "groups", PAGES[0], new CmsGroupWidget(null, null, getParamOufqn()))); addWidget(new CmsWidgetDialogParameter(this, "roles", PAGES[0], new CmsSelectWidget(getSelectRoles()))); addWidget(new CmsWidgetDialogParameter(this, "password", PAGES[0], new CmsInputWidget())); addWidget(new CmsWidgetDialogParameter(this, "importFile", PAGES[0], new CmsHttpUploadWidget())); } /** * @see org.opencms.workplace.CmsWidgetDialog#fillWidgetValues(javax.servlet.http.HttpServletRequest) */ protected void fillWidgetValues(HttpServletRequest request) { Map parameters; if (getMultiPartFileItems() != null) { parameters = CmsRequestUtil.readParameterMapFromMultiPart( getCms().getRequestContext().getEncoding(), getMultiPartFileItems()); } else { parameters = request.getParameterMap(); } Map processedParameters = new HashMap(); Iterator p = parameters.entrySet().iterator(); // make sure all "hidden" widget parameters are decoded while (p.hasNext()) { Map.Entry entry = (Map.Entry)p.next(); String key = (String)entry.getKey(); String[] values = (String[])entry.getValue(); if (key.startsWith(HIDDEN_PARAM_PREFIX)) { // this is an encoded hidden parameter key = key.substring(HIDDEN_PARAM_PREFIX.length()); String[] newValues = new String[values.length]; for (int l = 0; l < values.length; l++) { newValues[l] = CmsEncoder.decode(values[l], getCms().getRequestContext().getEncoding()); } values = newValues; } processedParameters.put(key, values); } // now process the parameters m_widgetParamValues = new HashMap(); Iterator i = getWidgets().iterator(); while (i.hasNext()) { // check for all widget base parameters CmsWidgetDialogParameter base = (CmsWidgetDialogParameter)i.next(); List params = new ArrayList(); int maxOccurs = base.getMaxOccurs(); boolean onPage = false; if (base.isCollectionBase()) { // for a collection base, check if we are on the page where the collection base is shown if (CmsStringUtil.isNotEmpty(getParamAction()) && !DIALOG_INITIAL.equals(getParamAction())) { // if no action set (usually for first display of dialog) make sure all values are shown // DIALOG_INITIAL is a special value for the first display and must be handled the same way String page = getParamPage(); // keep in mind that since the paramPage will be set AFTER the widget values are filled, // so the first time this page is called from another page the following will result to "false", // but for every "submit" on the page this will be "true" onPage = CmsStringUtil.isEmpty(page) || CmsStringUtil.isEmpty(base.getDialogPage()) || base.getDialogPage().equals(page); } } for (int j = 0; j < maxOccurs; j++) { // check for all possible values in the request parameters String id = CmsWidgetDialogParameter.createId(base.getName(), j); boolean required = (params.size() < base.getMinOccurs()) || (processedParameters.get(id) != null) || (!onPage && base.hasValue(j)); if (required) { CmsWidgetDialogParameter param = new CmsWidgetDialogParameter(base, params.size(), j); param.setKeyPrefix(KEY_PREFIX); base.getWidget().setEditorValue(getCms(), processedParameters, this, param); params.add(param); } } m_widgetParamValues.put(base.getName(), params); } } /** * Initializes the message info object to work with depending on the dialog state and request parameters.<p> */ protected void initImportObject() { try { if (CmsStringUtil.isEmpty(getParamAction()) || CmsDialog.DIALOG_INITIAL.equals(getParamAction())) { // create a new list setGroups(new ArrayList()); setRoles(new ArrayList()); } else { // this is not the initial call, get the message info object from session setGroups((List)((Map)getDialogObject()).get("groups")); setRoles((List)((Map)getDialogObject()).get("roles")); m_importFile = (String)((Map)getDialogObject()).get("importfile"); m_password = (String)((Map)getDialogObject()).get("password"); } } catch (Exception e) { // create a new list setGroups(new ArrayList()); setRoles(new ArrayList()); } } /** * @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest) */ protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { // initialize parameters and dialog actions in super implementation super.initWorkplaceRequestValues(settings, request); HashMap objectsMap = new HashMap(); objectsMap.put("groups", getGroups()); objectsMap.put("roles", getRoles()); objectsMap.put("importfile", m_importFile); objectsMap.put("password", m_password); // save the current state of the message (may be changed because of the widget values) setDialogObject(objectsMap); } }