Commit 1776b9e4 authored by Ryan Graham's avatar Ryan Graham Committed by ryang

* Added the ability to allow users to specify the import and export file locations

* JM-369
* Added additional information to the migration section of the readme file

git-svn-id: http://svn.igniterealtime.org/svn/repos/messenger/trunk@2755 b35dd754-fafc-0310-a699-88a17e54d16e
parent 7e45a0a4
...@@ -2,41 +2,46 @@ ...@@ -2,41 +2,46 @@
<html> <html>
<head> <head>
<title>User Import/Export Plugin Changelog</title> <title>User Import/Export Plugin Changelog</title>
<style type="text/css"> <style type="text/css">
BODY { BODY {
font-size : 100%; font-size : 100%;
} }
BODY, TD, TH {
font-family : tahoma, verdana, arial, helvetica, sans-serif; BODY, TD, TH {
font-size : 0.8em; font-family : tahoma, verdana, arial, helvetica, sans-serif;
} font-size : 0.8em;
H2 { }
font-size : 10pt;
font-weight : bold; H2 {
padding-left : 1em; font-size : 10pt;
} font-weight : bold;
A:hover { padding-left : 1em;
text-decoration : none; }
}
H1 { A:hover {
font-family : tahoma, arial, helvetica, sans-serif; text-decoration : none;
font-size : 1.4em; }
font-weight: bold;
border-bottom : 1px #ccc solid; H1 {
padding-bottom : 2px; font-family : tahoma, arial, helvetica, sans-serif;
} font-size : 1.4em;
font-weight: bold;
border-bottom : 1px #ccc solid;
padding-bottom : 2px;
}
TT { TT {
font-family : courier new; font-family : courier new;
font-weight : bold; font-weight : bold;
color : #060; color : #060;
} }
PRE {
font-family : courier new; PRE {
font-size : 100%; font-family : courier new;
} font-size : 100%;
</style> }
</style>
</head> </head>
<body> <body>
...@@ -44,11 +49,18 @@ ...@@ -44,11 +49,18 @@
User Import/Export Plugin Changelog User Import/Export Plugin Changelog
</h1> </h1>
<p><b>2.0</b> -- September 1, 2005</p>
<ul>
<li>Added the ability to allow users to specify the import and export file locations.
<li>[<a href="http://www.jivesoftware.org/issues/browse/JM-369">JM-369</a>] - Add option to replace old domain with new domain while doing an import.
<li>Added additional information to the migration section of the readme file.
</ul>
<p><b>1.0.1</b> -- June 30, 2005</p> <p><b>1.0.1</b> -- June 30, 2005</p>
<ul> <ul>
<li>Added the ability to send export data directly to the screen.</li> <li>Added the ability to send export data directly to the screen.</li>
<li>Fixed compatibility issue with Messenger version 2.1.4 and 2.1.5.</li> <li>Fixed compatibility issue with Messenger version 2.1.4 and 2.1.5.</li>
<li>Refactored the code that creates the output directory to try and alleviate permission issues on Unix installations.</li> <li>Refactored the code that creates the output directory to try and alleviate permission issues on Unix installations.</li>
</ul> </ul>
<p><b>1.0</b> -- June 1, 2005</p> <p><b>1.0</b> -- June 1, 2005</p>
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<plugin> <plugin>
<class>org.jivesoftware.messenger.plugin.ImportExportPlugin</class> <class>org.jivesoftware.messenger.plugin.ImportExportPlugin</class>
<name>User Import Export</name> <name>User Import Export</name>
<description>Enables import and export of user data.</description> <description>Enables import and export of user data.</description>
<author>Ryan Graham</author> <author>Ryan Graham</author>
<version>1.0.1</version> <version>2.0</version>
<date>06/30/2005</date> <date>09/01/2005</date>
<minServerVersion>2.1.4</minServerVersion> <minServerVersion>2.1.5</minServerVersion>
<adminconsole> <adminconsole>
<tab id="tab-users"> <tab id="tab-users">
<sidebar id="user-import-export" name="Import &amp; Export"> <sidebar id="user-import-export" name="Import &amp; Export">
<item id="import-export-selection" name="User Import &amp; Export" <item id="import-export-selection" name="User Import &amp; Export"
url="import-export-selection.jsp" url="import-export-selection.jsp"
description="Allows the importing and exporting of Messenger user data." /> description="Allows the importing and exporting of Messenger user data." />
</sidebar> </sidebar>
</tab> </tab>
</adminconsole> </adminconsole>
</plugin> </plugin>
\ No newline at end of file
This diff is collapsed.
package org.jivesoftware.messenger.plugin; package org.jivesoftware.messenger.plugin;
import java.io.File; import com.sun.msv.reader.util.GrammarLoader;
import java.net.MalformedURLException; import com.sun.msv.reader.util.IgnoreController;
import java.net.URL; import com.sun.msv.verifier.DocumentDeclaration;
import com.sun.msv.verifier.Verifier;
import javax.xml.parsers.SAXParserFactory;
import org.dom4j.Document; import org.dom4j.Document;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
...@@ -16,10 +15,11 @@ import org.xml.sax.ErrorHandler; ...@@ -16,10 +15,11 @@ import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator; import org.xml.sax.Locator;
import org.xml.sax.SAXParseException; import org.xml.sax.SAXParseException;
import com.sun.msv.reader.util.GrammarLoader; import java.io.File;
import com.sun.msv.reader.util.IgnoreController; import java.net.MalformedURLException;
import com.sun.msv.verifier.DocumentDeclaration; import java.net.URL;
import com.sun.msv.verifier.Verifier;
import javax.xml.parsers.SAXParserFactory;
public class UserSchemaValidator { public class UserSchemaValidator {
private Document doc; private Document doc;
......
<%@ page import="java.io.IOException, <%@ page import="java.io.IOException,
java.util.*, java.util.*,
org.jivesoftware.admin.AdminPageBean, org.jivesoftware.admin.AdminPageBean,
org.jivesoftware.messenger.plugin.ImportExportPlugin, org.jivesoftware.messenger.plugin.ImportExportPlugin,
org.jivesoftware.messenger.XMPPServer, org.jivesoftware.messenger.XMPPServer,
org.jivesoftware.util.ParamUtils" org.jivesoftware.util.ParamUtils"
%> %>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<jsp:useBean id="admin" class="org.jivesoftware.util.WebManager" /> <jsp:useBean id="admin" class="org.jivesoftware.util.WebManager" />
<% <%
admin.init(request, response, session, application, out); admin.init(request, response, session, application, out);
boolean exportUsers = request.getParameter("exportUsers") != null; boolean exportUsers = request.getParameter("exportUsers") != null;
boolean success = request.getParameter("success") != null; boolean success = request.getParameter("success") != null;
...@@ -21,41 +21,28 @@ ...@@ -21,41 +21,28 @@
String exportText = ""; String exportText = "";
Map errors = new HashMap(); Map<String, String> errors = new HashMap<String, String>();
if (exportUsers) { if (exportUsers) {
if (exportToFile) { if (exportToFile) {
String file = ParamUtils.getParameter(request, "exportFile"); String file = ParamUtils.getParameter(request, "exportFile");
if ((file == null) || (file.length() <= 0)) { if ((file == null) || (file.length() <= 0)) {
errors.put("missingFile","missingFile"); errors.put("missingFile","missingFile");
} }
else { else {
try { response.sendRedirect("export-file.jsp?fileName="+file);
//todo this could take some, redirect to a progress page? }
if (plugin.exportUsersToFile(file)) {
response.sendRedirect("export-user-data.jsp?success=true");
return;
}
else {
errors.put("fileNotCreated","fileNotCreated");
}
}
catch (IOException e) {
errors.put("IOException","IOException");
}
}
} }
else { else {
try { try {
exportText = plugin.exportUsersToString(); exportText = plugin.exportUsersToString();
}
catch (IOException e) {
errors.put("IOException","IOException");
} }
catch (IOException e) {
errors.put("IOException","IOException");
}
} }
} }
%> %>
<jsp:useBean id="pageinfo" scope="request" class="org.jivesoftware.admin.AdminPageBean" /> <jsp:useBean id="pageinfo" scope="request" class="org.jivesoftware.admin.AdminPageBean" />
<% // Title of this page and breadcrumbs <% // Title of this page and breadcrumbs
String title = "Export User Data"; String title = "Export User Data";
...@@ -73,14 +60,14 @@ ...@@ -73,14 +60,14 @@
<table cellpadding="0" cellspacing="0" border="0"> <table cellpadding="0" cellspacing="0" border="0">
<tbody> <tbody>
<tr> <tr>
<td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0"></td> <td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0"></td>
<td class="jive-icon-label"> <td class="jive-icon-label">
<% if (errors.containsKey("missingFile")) { %> <% if (errors.containsKey("missingFile")) { %>
Missing or bad file name. Missing or bad file name.
<% } else if (errors.containsKey("IOException") || errors.containsKey("fileNotCreated")) { %> <% } else if (errors.containsKey("IOException") || errors.containsKey("fileNotCreated")) { %>
Couldn't create export file. Couldn't create export file.
<% } %> <% } %>
</td> </td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
...@@ -93,8 +80,8 @@ ...@@ -93,8 +80,8 @@
<table cellpadding="0" cellspacing="0" border="0"> <table cellpadding="0" cellspacing="0" border="0">
<tbody> <tbody>
<tr> <tr>
<td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0"></td> <td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0"></td>
<td class="jive-icon-label">User data successfully exported.</td> <td class="jive-icon-label">User data successfully exported.</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
...@@ -107,49 +94,37 @@ ...@@ -107,49 +94,37 @@
<fieldset> <fieldset>
<legend>Export Options</legend> <legend>Export Options</legend>
<div> <div>
<p>
Select the radio button next to the desired export option and then click on the Export button.
</p>
<table cellpadding="3" cellspacing="0" border="0" width="100%"> <table cellpadding="3" cellspacing="0" border="0" width="100%">
<tbody> <tbody>
<tr> <tr>
<td width="1%"> <td width="1%"><input type="radio" name="exporttofile" value="true" <%= exportToFile ? "checked" : "" %> id="rb01"></td>
<input type="radio" name="exporttofile" value="true" <%= exportToFile ? "checked" : "" %> id="rb01"> <td width="99%"><label for="rb01"><b>To File</b></label> - Save user data to the specified file location.</td>
</td>
<td width="99%">
<label for="rb01"><b>To File</b></label> - Save user data to the specified file location.
</td>
<tr>
<td width="1%">&nbsp;</td>
<td width="99%">
<%= plugin.exportDirectory() %>
</td>
</tr>
<tr>
<td width="1%">&nbsp;</td>
<td width="99%">Export File Name:&nbsp;<input type="text" size="30" maxlength="150" name="exportFile"></td>
</tr>
</tr> </tr>
<tr> <tr>
<td width="1%"> <td width="1%">&nbsp;</td>
<input type="radio" name="exporttofile" value="false" <%= !exportToFile ? "checked" : "" %> id="rb02"> <td width="99%">Export File Name:&nbsp;<input type="text" size="30" maxlength="150" name="exportFile"></td>
</td> </tr>
<td width="99%"> <tr>
<label for="rb02"><b>To Screen</b></label> - Display user data in the text area below. <td width="1%"><input type="radio" name="exporttofile" value="false" <%= !exportToFile ? "checked" : "" %> id="rb02"></td>
</td> <td width="99%"><label for="rb02"><b>To Screen</b></label> - Display user data in the text area below.</td>
</tr> </tr>
<tr> <tr>
<td width="1%">&nbsp;</td> <td width="1%">&nbsp;</td>
<td width="99%"> <td width="99%"><textarea cols="80" rows="20" wrap=off><%=exportText %></textarea></td>
<textarea cols="80" rows="20" wrap=off><%=exportText %></textarea>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</fieldset> </fieldset>
<br><br> <br><br>
<input type="submit" value="Export"> <input type="submit" value="Export">
</form> </form>
<jsp:include page="bottom.jsp" flush="true" /> <jsp:include page="bottom.jsp" flush="true" />
\ No newline at end of file
<%@ page import="org.jivesoftware.admin.AdminPageBean, <%@ page import="org.jivesoftware.admin.AdminPageBean,
org.jivesoftware.messenger.plugin.ImportExportPlugin, org.jivesoftware.messenger.plugin.ImportExportPlugin,
org.jivesoftware.messenger.XMPPServer" org.jivesoftware.messenger.XMPPServer"
%> %>
<jsp:useBean id="pageinfo" scope="request" class="org.jivesoftware.admin.AdminPageBean" /> <jsp:useBean id="pageinfo" scope="request" class="org.jivesoftware.admin.AdminPageBean" />
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<% if (plugin.isUserProviderReadOnly()) { %> <% if (plugin.isUserProviderReadOnly()) { %>
Sorry, because you are using LDAP as your user store this plugin will not work with your Messenger installation. Sorry, because you are using LDAP as your user store, this plugin will not work with your Messenger installation.
<% } else { %> <% } else { %>
...@@ -28,10 +28,10 @@ The import and export functions allow you to read data into and write user ...@@ -28,10 +28,10 @@ The import and export functions allow you to read data into and write user
data from your Jive Messenger installation. data from your Jive Messenger installation.
<ul> <ul>
<li><a href="import-user-data.jsp">Import User Data</a></li> <li><a href="import-user-data.jsp">Import User Data</a></li>
<li><a href="export-user-data.jsp">Export User Data</a></li> <li><a href="export-user-data.jsp">Export User Data</a></li>
</ul> </ul>
<% } %> <% } %>
<jsp:include page="bottom.jsp" flush="true" /> <jsp:include page="bottom.jsp" flush="true" />
\ No newline at end of file
<%@ page import="java.io.IOException, <%@ page import="java.net.MalformedURLException,
java.net.MalformedURLException, java.util.*,
java.util.*, org.dom4j.DocumentException,
org.dom4j.DocumentException, org.apache.commons.fileupload.DiskFileUpload,
org.jivesoftware.admin.AdminPageBean, org.apache.commons.fileupload.FileItem,
org.jivesoftware.messenger.plugin.ImportExportPlugin, org.jivesoftware.admin.AdminPageBean,
org.jivesoftware.messenger.XMPPServer, org.jivesoftware.messenger.plugin.ImportExportPlugin,
org.jivesoftware.util.ParamUtils" org.jivesoftware.util.ParamUtils"
%> %>
<jsp:useBean id="admin" class="org.jivesoftware.util.WebManager" /> <jsp:useBean id="admin" class="org.jivesoftware.util.WebManager" />
<c:set var="admin" value="${admin.manager}" /> <%
<% admin.init(request, response, session, application, out); admin.init(request, response, session, application, out);
boolean importUsers = request.getParameter("importUsers") != null; boolean importUsers = request.getParameter("importUsers") != null;
boolean success = request.getParameter("success") != null; boolean success = request.getParameter("success") != null;
ImportExportPlugin plugin = (ImportExportPlugin) XMPPServer.getInstance().getPluginManager().getPlugin("userimportexport"); ImportExportPlugin plugin = (ImportExportPlugin) admin.getXMPPServer().getPluginManager().getPlugin("userimportexport");
List duplicateUsers = new ArrayList(); List<String> duplicateUsers = new ArrayList<String>();
Map errors = new HashMap(); Map<String, String> errors = new HashMap<String, String>();
if (importUsers) { if (importUsers) {
String file = ParamUtils.getParameter(request, "importFile"); DiskFileUpload dfu = new DiskFileUpload();
if ((file == null) || (file.length() <= 0)) {
errors.put("badFile", "badFile"); List fileItems = dfu.parseRequest(request);
Iterator i = fileItems.iterator();
FileItem fi = (FileItem) i.next();
FileItem pd = (FileItem) i.next();
String previousDomain = pd.getString();
try {
if (isEmpty(previousDomain)) {
duplicateUsers.addAll(plugin.importUserData(fi, null));
}
else if (!isEmpty(previousDomain)) {
duplicateUsers.addAll(plugin.importUserData(fi, previousDomain));
}
else {
errors.put("missingDomain", "missingDomain");
}
if (duplicateUsers.size() == 0) {
response.sendRedirect("import-user-data.jsp?success=true");
return;
}
errors.put("userAlreadyExists", "userAlreadyExists");
}
catch (MalformedURLException e) {
errors.put("IOException", "IOException");
} }
else { catch (DocumentException e) {
try { errors.put("DocumentException", "DocumentException");
//todo this could take some, redirect to a progress page? }
if (plugin.validateImportFile(file)) { }
duplicateUsers.addAll(plugin.importUserData(file));
if (duplicateUsers.size() == 0) {
response.sendRedirect("import-user-data.jsp?success=true");
return;
}
errors.put("userAlreadyExists", "userAlreadyExists");
}
else {
errors.put("invalidUserFile", "invalidUserFile");
}
}
catch (MalformedURLException e) {
errors.put("MalformedURLException", "MalformedURLException");
}
catch (DocumentException e) {
errors.put("DocumentException", "DocumentException");
}
}
}
%> %>
<jsp:useBean id="pageinfo" scope="request" class="org.jivesoftware.admin.AdminPageBean" /> <jsp:useBean id="pageinfo" scope="request" class="org.jivesoftware.admin.AdminPageBean" />
...@@ -64,35 +68,37 @@ ...@@ -64,35 +68,37 @@
<% if (errors.size() > 0) { %> <% if (errors.size() > 0) { %>
<div class="jive-error"> <div class="jive-error">
<table cellpadding="0" cellspacing="0" border="0"> <table cellpadding="0" cellspacing="0" border="0">
<tbody> <tbody>
<tr> <tr>
<td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0"></td> <td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0"></td>
<td class="jive-icon-label"> <td class="jive-icon-label">
<% if (errors.containsKey("MalformedURLException") || errors.containsKey("badFile")) { %> <% if (errors.containsKey("missingDomain")) { %>
Missing or bad file name. You must supply both a existing and new domain name.
<% } else if (errors.containsKey("DocumentException")) { %> <% } else if (errors.containsKey("IOException")) { %>
Import failed. Missing or bad file name.
<% } else if (errors.containsKey("invalidUserFile")) { %> <% } else if (errors.containsKey("DocumentException")) { %>
The import file does not match the user schema. Import failed.
<% } else if (errors.containsKey("userAlreadyExists")) { %> <% } else if (errors.containsKey("invalidUserFile")) { %>
The following users are already exist in the system and were not loaded:<br> The import file does not match the user schema.
<% <% } else if (errors.containsKey("userAlreadyExists")) { %>
Iterator iter = duplicateUsers.iterator(); The following users are already exist in the system and were not loaded:<br>
while (iter.hasNext()) { <%
String username = (String) iter.next(); Iterator iter = duplicateUsers.iterator();
%><%= username %><% while (iter.hasNext()) {
if (iter.hasNext()) { String username = (String) iter.next();
%>,&nbsp;<% %><%= username %><%
} else { if (iter.hasNext()) {
%>.<% %>,&nbsp;<%
} } else {
} %>.<%
} %> }
</td> }
} %>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<br> <br>
...@@ -101,46 +107,53 @@ ...@@ -101,46 +107,53 @@
<div class="jive-success"> <div class="jive-success">
<table cellpadding="0" cellspacing="0" border="0"> <table cellpadding="0" cellspacing="0" border="0">
<tbody> <tbody>
<tr> <tr>
<td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0"></td> <td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0"></td>
<td class="jive-icon-label">All users added successfully.</td> <td class="jive-icon-label">All users added successfully.</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<br> <br>
<% } %> <% } %>
<form action="import-user-data.jsp?importUsers" method="post" enctype="multipart/form-data">
<form action="import-user-data.jsp?importUsers" method="post"> <fieldset>
<legend>Import</legend>
<div class="jive-table"> <div>
<table cellpadding="0" cellspacing="0" border="0" width="100%"> <p>
<thead> Use the Browse button to select the file that conatians the Jive Messenger user data to be imported, then click on the Import button.
<tr> </p>
<th>Import Properties</th> <input type="file" name="thefile"><input type="submit" value="Import">
</tr>
</thead> <br><br><br>
<tr class="jive-even">
<td style="border-right:1px #ccc solid;">Import Location:</td> <p>
</tr> <b>Optional</b> - Use the field below to replace the domain name of user roster entries with the current hostname.
<tr class="jive-odd"> See the migration section of the <a href="../../plugin-admin.jsp?plugin=userimportexport&showReadme=true">readme</a> for details.
<td style="border-right:1px #ccc solid;"><%= plugin.exportDirectory() %></td> </p>
</tr> Existing Domain:<input type="text" size="20" maxlength="150" name="previousDomain" value=""/>
<tr class="jive-even">
<td style="border-right:1px #ccc solid;">Import File Name:</td> </div>
</tr> </fieldset>
<tr class="jive-odd">
<td style="border-right:1px #ccc solid;"><input type="text" size="30" maxlength="150" name="importFile"></td>
</tr>
</table>
</div>
<br><br>
<input type="submit" value="Import">
</form> </form>
<jsp:include page="bottom.jsp" flush="true" /> <jsp:include page="bottom.jsp" flush="true" />
\ No newline at end of file
<%!
public boolean isEmpty(String s) {
if (s == null) {
return true;
}
if (s.trim().length() == 0) {
return true;
}
return false;
}
%>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment