package com.webgroupmedia.cerb4.exporter.zendesk.entities;
import java.io.File;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.zendesk.ZendeskConnection;
public class Worker {
public void export() {
final String cfgOutputDir = Configuration.get("outputDir", "output");
final String cfgExportEncoding = new String(Configuration.get("exportEncoding", "ISO-8859-1"));
final String cfgInitialWorkerPassword = new String(Configuration.get("initialWorkerPassword", "changeme"));
List<Element> userList = new ArrayList<Element>();
List<Element> agentList;
int agentPageNum=1;
do {
agentList = null;
agentList = getAgentsForRole(4, agentPageNum++);
userList.addAll(agentList);
}
while(agentList.size()==15);
List<Element> adminList;
int adminPageNum=1;
do {
adminList = null;
adminList = getAgentsForRole(2, adminPageNum++);
userList.addAll(adminList);
}
while(adminList.size()==15);
Integer iCount = 0;
Integer iSubDir = 0;
File outputDir = null;
for (Element userElm : userList) {
Integer userId = Integer.parseInt(userElm.elementText("id"));
String name = userElm.elementText("name");
String email = userElm.elementText("email");
Integer role = Integer.parseInt(userElm.elementText("roles"));
String isSuperuser = (role == 2) ? "1" : "0";
String firstName="", lastName="";
if (-1 != name.indexOf(" ")) {
firstName = name.substring(0, name.indexOf(" "));
lastName = name.substring(name.indexOf(" "));
} else {
firstName = name;
}
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding(cfgExportEncoding);
Element eWorker = doc.addElement("worker");
eWorker.addElement("first_name").addText(firstName);
eWorker.addElement("last_name").addText(lastName);
eWorker.addElement("email").addText(email);
eWorker.addElement("password").addText(getMd5Digest(cfgInitialWorkerPassword));
eWorker.addElement("is_superuser").addText(isSuperuser);
if (0 == iCount % 2000) {
iSubDir++;
// Make the output subdirectory
outputDir = new File(cfgOutputDir + "/00-workers-" + String.format("%06d", iSubDir));
outputDir.mkdirs();
}
String sXmlFileName = outputDir.getPath() + "/" + String.format("%06d", userId) + ".xml";
try {
new XMLThread(doc, sXmlFileName).start();
} catch (Exception e) {
e.printStackTrace();
}
iCount++;
}
}
private List<Element> getAgentsForRole(int role, Integer page) {
List<Element> agentsList = new ArrayList<Element>();
Map<String,String> params = new HashMap<String,String>();
params.put("role", Integer.toString(role));
params.put("page", page.toString());
Document document = ZendeskConnection.getInstance().requestZendeskDocumentSerial("users", null, params);
Element usersElm = document.getRootElement();
if(!usersElm.getName().equals("users")) {
return agentsList;
}
@SuppressWarnings("unchecked")
List<Element> userElms = usersElm.elements("user");
for (Element userElm : userElms) {
agentsList.add(userElm);
}
return agentsList;
}
private static String getMd5Digest(String input)
{
try
{
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
BigInteger number = new BigInteger(1,messageDigest);
String md5Str = number.toString(16);
if(md5Str.length() < 32) {
int fillCount = 32 - md5Str.length();
StringBuffer zeroBuffer = new StringBuffer();
for(int i=0; i < fillCount; i++) {
zeroBuffer.append("0");
}
md5Str = zeroBuffer.toString() + md5Str;
}
return md5Str;
}
catch(NoSuchAlgorithmException e)
{
throw new RuntimeException(e);
}
}
}