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.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; import com.webgroupmedia.cerb4.exporter.zendesk.ZenRunnable.IResponseHandler; public class Contact { private final String sExportEncoding = Configuration.get("exportEncoding", "ISO-8859-1"); private final String cfgOutputDir = Configuration.get("outputDir", "output"); private final String cfgInitialContactPassword = new String(Configuration.get("initialContactPassword", "")); private Map<Integer,String> orgMap; private boolean lastPageReached = false; private File outputDir; private int iCount=0; private int iSubDirCount=0; public void export() { initOrgsMap(); Integer page = 0; while(!lastPageReached) { page++; Map<String,String> params = new HashMap<String,String>(); params.put("role", "0"); params.put("page", page.toString()); ZendeskConnection.getInstance().requestZendeskDocumentAsync("users", null, params, new IResponseHandler() { public void onZenResponse(Document usersDoc) { Element usersElm = usersDoc.getRootElement(); @SuppressWarnings("unchecked") List<Element> userElms = usersElm.elements("user"); if(userElms==null || userElms.size() == 0) { lastPageReached = true; return; } for (Element userElm : userElms) { Integer userId = Integer.parseInt(userElm.elementText("id")); String name = userElm.elementText("name"); String email = userElm.elementText("email"); String firstName="", lastName=""; if (-1 != name.indexOf(" ")) { firstName = name.substring(0, name.indexOf(" ")); lastName = name.substring(name.indexOf(" ")); } else { firstName = name; } Integer orgId; try { orgId = Integer.parseInt(userElm.elementText("organization-id")); } catch(NumberFormatException e) { orgId = -1; } String password=""; if(cfgInitialContactPassword.length() > 0) { password = getMd5Digest(cfgInitialContactPassword); } Document doc = DocumentHelper.createDocument(); Element eContact = doc.addElement("contact"); doc.setXMLEncoding(sExportEncoding); eContact.addElement("first_name").addText(firstName); eContact.addElement("last_name").addText(lastName); eContact.addElement("email").addText(email); eContact.addElement("password").addText(password); eContact.addElement("phone").addText(""); String orgName = orgMap.get(orgId); if(orgName == null) orgName = ""; eContact.addElement("organization").addText(orgName); String sXmlFileName = getXmlWritePath(userId, doc); try { new XMLThread(doc, sXmlFileName).start(); } catch (Exception e) { e.printStackTrace(); } } } }); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void initOrgsMap() { orgMap = new HashMap<Integer, String>(); Map<String,String> params = new HashMap<String,String>(); Document orgDoc = ZendeskConnection.getInstance().requestZendeskDocumentSerial("organizations", null, params); Element organizationsElm = orgDoc.getRootElement(); @SuppressWarnings("unchecked") List<Element> orgElms = organizationsElm.elements("organization"); for (Element orgElm : orgElms) { Integer orgId = Integer.parseInt(orgElm.elementText("id")); String name = orgElm.elementText("name"); orgMap.put(orgId, name); } } 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); } } private synchronized String getXmlWritePath(Integer userId, Document doc) { if (0 == iCount % 2000) { // Make the output subdirectory outputDir = new File(cfgOutputDir + "/03-contacts-" + String.format("%09d", ++iSubDirCount)); outputDir.mkdirs(); } iCount++; return outputDir.getPath() + "/" + String.format("%09d", userId) + ".xml"; } }