package com.webgroupmedia.cerb4.exporter.rt.entities;
import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashSet;
import java.util.Set;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.cerb4.impex.Configuration;
import com.cerb4.impex.XMLThread;
import com.webgroupmedia.cerb4.exporter.rt.Database;
import com.webgroupmedia.cerb4.exporter.rt.Driver;
public class Worker {
private Set<Integer> superuserSet;
public void export() {
Connection conn = Database.getInstance();
String cfgOutputDir = Configuration.get("outputDir", "output");
String sExportEncoding = new String(Configuration.get("exportEncoding", "ISO-8859-1"));
String cfgExportRTGroup = new String(Configuration.get("exportWorkersRTGroup", "Privileged"));
Integer iCount = 0;
Integer iSubDir = 0;
try {
initSuperuserSet();
Statement s = conn.createStatement();
String sql = "SELECT u.id, u.RealName, u.EmailAddress, u.Password " +
"FROM Users u " +
"INNER JOIN GroupMembers gm on gm.MemberId = u.id " +
"INNER JOIN Groups g ON gm.GroupId = g.id " +
"WHERE 1=1 ";
String sqlLastCondition = "";
boolean exportPrivileged = (cfgExportRTGroup.equals("Privileged"));
if(exportPrivileged) {
sqlLastCondition = "AND g.Type = 'Privileged' ";
}
else {
String groupsQueryStr = Driver.generateGroupsListSQL(cfgExportRTGroup);
sqlLastCondition = "AND g.Domain='UserDefined' AND g.Name IN (" + groupsQueryStr+") ";
}
String sqlOrder = "ORDER BY u.id ";
sql += sqlLastCondition + sqlOrder;
s.execute(sql);
ResultSet rs = s.getResultSet();
File outputDir = null;
while(rs.next()) {
if(0 == iCount % 2000 || 0 == iCount) {
iSubDir++;
// Make the output subdirectory
outputDir = new File(cfgOutputDir+"/00-workers-" + String.format("%06d", iSubDir));
outputDir.mkdirs();
}
Document doc = DocumentHelper.createDocument();
Element eWorker = doc.addElement("worker");
doc.setXMLEncoding(sExportEncoding);
Integer userId = rs.getInt("id");
Integer isSuperuser = superuserSet.contains(userId) ? 1 : 0;
String sName = Driver.fixMagicQuotes(rs.getString("RealName"));
String sEmail = Driver.fixMagicQuotes(rs.getString("EmailAddress"));
String sPassword = rs.getString("Password");
String sFirstName, sLastName="";
if(-1 != sName.indexOf(" ")) {
sFirstName = sName.substring(0,sName.indexOf(" "));
sLastName = sName.substring(sName.indexOf(" "));
} else {
sFirstName = sName;
}
if(0 == sEmail.length())
continue;
eWorker.addElement("first_name").addText(sFirstName);
eWorker.addElement("last_name").addText(sLastName);
eWorker.addElement("email").addText(sEmail);
eWorker.addElement("password").addText(sPassword);
eWorker.addElement("is_superuser").addText(isSuperuser.toString());
String sXmlFileName = outputDir.getPath() + "/" + String.format("%06d", userId) + ".xml";
try {
new XMLThread(doc, sXmlFileName).start();
} catch(Exception e) {
e.printStackTrace();
}
iCount++;
}
rs.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void initSuperuserSet() {
Connection conn = Database.getInstance();
//figure out what user ids are superusers
String sqlSuperuser = "SELECT u.id " +
"FROM Users u " +
"INNER JOIN GroupMembers gmacl ON gmacl.MemberId = u.id " +
"LEFT JOIN ACL acl ON gmacl.GroupId = acl.PrincipalId " +
"WHERE acl.RightName = 'SuperUser' " +
"ORDER BY u.id";
Statement statementSuperuser;
try {
statementSuperuser = conn.createStatement();
statementSuperuser.execute(sqlSuperuser);
ResultSet rsSuperuser =statementSuperuser.getResultSet();
superuserSet = new HashSet<Integer>();
while(rsSuperuser.next()) {
Integer userId = rsSuperuser.getInt("id");
superuserSet.add(userId);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}