📄 ubbexport.java
字号:
if (memberTotal.length > 0) {
try {
memberCount = Integer.parseInt(memberTotal[0]);
}
catch (Exception e) {
e.printStackTrace();
}
}
//Get forum info
int forumCount = 0;
File forumsFile = new File(ubbCGIDir, "forums.cgi");
String [] forumData = fileToArray(forumsFile);
forumCount = forumData.length;
//Output number of users found to export and number of forums to export.
String foundString = "Found " + forumCount + " forum";
if (forumCount > 1) {
foundString += "s";
}
foundString += " and " + memberCount + " member";
if (memberCount > 1) {
foundString += "s";
}
foundString += " to export.";
println(foundString);
println(" ");
println("Enter the name of the file you'd like to write the data out to:");
print("[" + fullFile + "] > ");
String xmlName = readLine();
if (xmlName.equals("")) {
xmlName = fullFile;
}
fullFile = xmlName;
boolean done = false;
while (!done) {
println(" ");
println("Ready to begin export. Enter the number of the command you'd like to perform:");
println(" (1) Proceed with export to file \"" + xmlName + "\".");
println(" (2) Abandon export.");
print("> ");
String response = readLine();
println(" ");
try {
int choice = Integer.parseInt(response);
switch (choice) {
case 1:
println("Starting data export...");
//Output data to file.
//Write data as UTF-8 so that extended chars turn out correctly.
try {
Writer out = new UnicodeFilterWriter(
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(xmlName),
"UTF-8"),2097152));
out.write("<?xml version=\"1.0\"?>");
out.write("<!DOCTYPE Jive SYSTEM \"jive.dtd\">");
out.write("<Jive xmlversion=\"" + XML_VERSION + "\" exportDate=\"" +
dateFormatter.format(new Date()) + "\">"
);
print("Exporting user data...");
int userCount = writeUserXML(memberDir, out);
out.flush();
println("\nFinished exporting " + userCount + " users.");
// Export all forums
out.write("<ForumList>");
for (int i=0; i<forumCount; i++) {
FullStringTokenizer tokens = new FullStringTokenizer(forumData[i],"|");
tokens.nextToken();
String forumName = tokens.nextToken();
String forumDescription = tokens.nextToken();
for (int j=0; j < 5; j++) {
tokens.nextToken();
}
int forumID = Integer.parseInt(tokens.nextToken());
File forumDir = new File(ubbDir, "Forum" + forumID);
if( forumDir.exists() ) {
println("Exporting data from " + forumDir.getAbsolutePath() );
int messageCount = writeForumXML(forumDir, forumID, forumName, forumDescription, out);
println("\nFinished exporting " + messageCount + " messages.\n");
}
}
out.write("</ForumList>");
out.write("</Jive>");
out.close();
}
catch(Exception e) {
e.printStackTrace();
}
done = true;
break;
case 2:
done = true;
break;
default:
println("ERROR - command not recognized. Please try again.");
}
}
catch (NumberFormatException nfe) {
println("ERROR - command not recognized. Please try again.");
}
}
}
public static void userExport() {
File ubbCGIDir = getUbbCGIDirectory();
File memberDir = new File(ubbCGIDir, "Members");
File memberTotalFile = new File(memberDir, "membertotal.cgi");
String [] memberTotal = fileToArray(memberTotalFile);
if (memberTotal.length > 0) {
println("Found " + memberTotal[0] + " members to export.");
println(" ");
println("Enter the name of the file you'd like to write the data out to:");
print("[" + usersFile + "] > ");
String xmlName = readLine();
if (xmlName.equals("")) {
xmlName = usersFile;
}
usersFile = xmlName;
boolean done = false;
while (!done) {
println(" ");
println("Ready to begin export. Enter the number of the command you'd like to perform:");
println(" (1) Proceed with export to file \"" + xmlName + "\".");
println(" (2) Abandon export.");
print("> ");
String response = readLine();
println(" ");
try {
int choice = Integer.parseInt(response);
switch (choice) {
case 1:
print("Starting user data export...");
//Output data to file.
try {
//Write data as UTF-8 so that extended chars turn out correctly.
BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(xmlName),
"UTF-8"
)
);
out.write("<?xml version=\"1.0\"?>");
out.write("<!DOCTYPE Jive SYSTEM \"jive.dtd\">");
out.write("<Jive version=\"" + XML_VERSION + "\" exportDate=\"" +
dateFormatter.format(new Date()) + "\">"
);
int userCount = writeUserXML(memberDir, out);
out.write("</Jive>");
out.close();
println("\nFinished exporting " + userCount + " users.");
}
catch (Exception e) {
e.printStackTrace();
}
done = true;
break;
case 2:
done = true;
break;
default:
println("ERROR - command not recognized. Please try again.");
}
}
catch (NumberFormatException nfe) {
println("ERROR - command not recognized. Please try again.");
}
}
}
else {
println("ERROR - the directory you entered exists but does not " +
"contain information about UBB members. Try again.");
userExport();
}
}
/**
* Gets the creation date for the specified forum. This date is determined
* by the date of the first message posted in the forum.
*/
private static Date getForumCreationDate( File forumDir, int forumNumber )
throws IOException
{
println( "Getting creation date for forum " + forumNumber + "..." );
Date creationDate = new Date();
// Get the file which lists the threads in this forum
File threadList = new File(forumDir, "forum" + forumNumber + ".threads");
BufferedReader listIn = new BufferedReader(new FileReader(threadList));
String threadLine = null;
boolean validDate = false;
// Loop through the list of threads until
// 1) there are no more threads to examine or
// 2) we've found a valid creation date
while ( ((threadLine = listIn.readLine()) != null) && !validDate ) {
FullStringTokenizer tokens = new FullStringTokenizer(threadLine, "|^|");
tokens.nextToken();
String firstThreadID = tokens.nextToken();
File firstThreadFile = new File( forumDir, firstThreadID+".cgi" );
BufferedReader messages = new BufferedReader(
new FileReader(firstThreadFile)
);
messages.readLine(); // skip first line
String rootMessage = messages.readLine();
if( rootMessage != null ) {
FullStringTokenizer mTokens = new FullStringTokenizer(rootMessage,"||");
// skip the first 3 tokens
mTokens.nextToken(); mTokens.nextToken(); mTokens.nextToken();
String date = mTokens.nextToken();
date += " " + mTokens.nextToken();
try {
creationDate = ubbMessageDateFormatter.parse(date);
} catch( ParseException e ) {
System.err.println("(getForumCreationDate): unparseable date: " + date);
}
// found a good date, get out of this loop
validDate = true;
}
messages.close();
}
listIn.close();
return creationDate;
}
private static Date getGregorianDate( double julianDate ) {
double l = julianDate + 68569.0;
double n = ( 4.0 * l ) / 146097.0;
l = l - ( ((146097.0*n)+3.0)/4.0);
double i = (4000.0 * (l+1.0))/1461001.0;
l = l - ((1461.0*i)/4.0) + 31.0;
double j = (80.0 * l) / 2447.0;
double d = l - ((2447.0*j)/80.0);
l = j/11.0;
double m = j + 2.0 - (12.0*l);
double y = 100.0 * (n-49.0) + i + l;
System.err.println("\n");
System.err.println("l: " + l);
System.err.println("n: " + n);
System.err.println("i: " + i);
System.err.println("j: " + j);
System.err.println("d: " + d);
System.err.println("m: " + m);
System.err.println("y: " + y);
return new Date();
// l = jd + 68569
// n = ( 4 * l ) / 146097
// l = l - ( 146097 * n + 3 ) / 4
// i = ( 4000 * ( l + 1 ) ) / 1461001
// l = l - ( 1461 * i ) / 4 + 31
// j = ( 80 * l ) / 2447
// d = l - ( 2447 * j ) / 80
// l = j / 11
// m = j + 2 - ( 12 * l )
// y = 100 * ( n - 49 ) + i + l
}
private static Date getForumModifiedDate( File forumDir, int forumNumber )
throws IOException
{
println( "Getting modified date for forum " + forumNumber + "..." );
// The modified date of this forum. Initialize it to now, although it
// will be changed when the correct modified date is found.
Date forumModifiedDate = new Date();
// Load the forumX.threads file. This file is a listing of threads ordered
// from oldest to newest modified.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -