package org.uiautomation.ios.wkrdp.message; import org.apache.commons.io.IOUtils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; /** * Created with IntelliJ IDEA. User: freynaud Date: 17/01/2013 Time: 15:08 To change this template * use File | Settings | File Templates. */ public class MessageFactory { private static final Logger log = Logger.getLogger(MessageFactory.class.getName()); private final Map<String, Class<? extends BaseIOSWebKitMessage>> types = new HashMap<String, Class<? extends BaseIOSWebKitMessage>>(); public MessageFactory() { types.put("_rpc_reportSetup:", ReportSetupMessage.class); types.put("_rpc_reportConnectedApplicationList:", ReportConnectedApplicationsMessage.class); types.put("_rpc_applicationSentListing:", ApplicationSentListingMessage.class); types.put("_rpc_applicationSentData:", ApplicationDataMessage.class); types.put("_rpc_applicationConnected:", ApplicationConnectedMessage.class); types.put("_rpc_applicationDisconnected:", ApplicationDisconnectedMessage.class); } public IOSMessage create(String rawMessage) { try { BaseIOSWebKitMessage m = new BaseIOSWebKitMessage(rawMessage); Class<? extends BaseIOSWebKitMessage> impl = types.get(m.getSelector()); if (impl == null) { throw new RuntimeException("NI " + m.getSelector()); } Object[] args = new Object[]{rawMessage}; Class<?>[] argsClass = new Class[]{String.class}; Constructor<?> c = impl.getConstructor(argsClass); IOSMessage message = (IOSMessage) c.newInstance(args); log.fine("Message: " + message); return message; } catch (Exception e1) { e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } return null; } private Document getDocument(String rawMessage) throws DocumentException { String message = rawMessage.replace( "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">", ""); SAXReader reader = new SAXReader(); Document document = reader.read(IOUtils.toInputStream(message)); return document; } private Node getWebKitDebugMessage(Document d) { Node n = d.selectSingleNode("/plist/dict/dict/data"); return n; } }