org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/deploy/emulator/EmulatorTargetType.java
changeset 458 5ff93668b08c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/deploy/emulator/EmulatorTargetType.java	Thu Jul 29 10:00:34 2010 -0700
@@ -0,0 +1,196 @@
+/**
+ * Copyright (c) 2010 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.core.deploy.emulator;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.symbian.tools.mtw.core.projects.IMTWProject;
+import org.symbian.tools.mtw.ui.deployment.IDeploymentTarget;
+import org.symbian.tools.mtw.ui.deployment.IDeploymentTargetType;
+import org.symbian.tools.wrttools.core.IWRTConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public final class EmulatorTargetType implements IDeploymentTargetType {
+    /**
+     * Map containing of the SDKS with the corresponding paths.
+     */
+    private Map<String, Emulator> listofEmulators;
+
+    public EmulatorTargetType() {
+        discoverTargets(new NullProgressMonitor());
+    }
+
+    public IDeploymentTarget[] getTargets(IMTWProject project) {
+        Collection<Emulator> values = listofEmulators.values();
+        return values.toArray(new Emulator[values.size()]);
+    }
+
+    public void discoverTargets(IProgressMonitor monitor) {
+        if (listofEmulators == null) {
+            listofEmulators = new HashMap<String, Emulator>();
+        }
+        listofEmulators.clear();
+        initialize();
+    }
+
+    public IDeploymentTarget findTarget(IMTWProject project, String id) {
+        return listofEmulators.get(id);
+    }
+
+    public boolean targetsDiscovered() {
+        return true;
+    }
+
+    public ISchedulingRule getSchedulingRule(IDeploymentTarget target) {
+        return null;
+    }
+
+    // helper methods
+
+    /**
+     * This will parse the xml and create the nodes to be displayed on the table
+     * viewer. The information will be used by content & label provider to get
+     * the contents and display accordingly in the list of the projects in the view.
+     */
+    public Map<String, Emulator> initialize() {
+
+        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        // Parse the devices.xml and retrieve the list of the emulators from it
+        // and build the list to be displayed in the view.
+
+        try {
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            File file = new File(IWRTConstants.DEVICES_XML_PATH);
+            if (!file.exists()) {
+                IPath otherPath = new Path(System.getProperty("user.home"))
+                        .append(IWRTConstants.DEVICES_VISTA_XML_PATH);
+                file = otherPath.toFile();
+            }
+            if (file.exists()) {
+                FileInputStream fin = new FileInputStream(file);
+                Document document = builder.parse(fin);
+                NodeList childNodes = document.getChildNodes();
+
+                for (int i = 0; i < childNodes.getLength(); i++) {
+
+                    Node node = childNodes.item(i);
+                    String nodeName = node.getNodeName();
+                    // If the node name is "devices" it is the root node of the xml.
+                    if (nodeName.equals(IWRTConstants.DEVICES_TAG)) {
+                        // once we have the root node get the child information to
+                        // build the devices list.
+                        createDevicesList(node);
+
+                    }
+                }
+            }
+        } catch (ParserConfigurationException e) {
+            //          WidgetUtils.getView().getLogger().severe(e.getMessage());
+        } catch (SAXException e) {
+            //          WidgetUtils.getView().getLogger().severe(e.getMessage());
+        } catch (IOException e) {
+            //          WidgetUtils.getView().getLogger().severe(e.getMessage());
+        }
+        return listofEmulators;
+    }
+
+    /**
+     * Creates the devices nodes in the table.
+     * @param parentNode
+     */
+    private void createDevicesList(Node parentNode) {
+        NodeList list = getChildNodes(parentNode);
+        for (int i = 0; i < list.getLength(); i++) {
+            Node node = list.item(i);
+            String nodeName = node.getNodeName();
+            if (nodeName.equals(IWRTConstants.DEVICE_TAG)) {
+                createDeviceChildNode(node);
+            }
+        }
+    }
+
+    /**
+     * Gets the EPOC ROOT node and than finally the list of devices.
+     * @param parentNode
+     */
+    private void createDeviceChildNode(Node parentNode) {
+        NodeList list = getChildNodes(parentNode);
+        for (int i = 0; i < list.getLength(); i++) {
+            Node node = list.item(i);
+            String nodeName = node.getNodeName();
+            if (nodeName.equals(IWRTConstants.EPOC_ROOT_TAG)) {
+                addProject(node, parentNode);
+            }
+        }
+    }
+
+    /**
+     * Adds the devices to the list to be displayed.
+     * @param deviceNode the device node 
+     * @param epocNode the epoc root node.
+     */
+    private void addProject(Node epocNode, Node deviceNode) {
+        NodeList list = getChildNodes(epocNode);
+        NamedNodeMap attributes = deviceNode.getAttributes();
+        String sdkId = "";
+        String sdkName = "";
+        for (int i = 0; i < attributes.getLength(); i++) {
+            Node item = attributes.item(i);
+            if (item.getNodeName().equals(IWRTConstants.NAME_ATTR)) {
+                sdkName = item.getNodeValue();
+            }
+            if (item.getNodeName().equals(IWRTConstants.ID_ATTR)) {
+                sdkId = item.getNodeValue();
+            }
+        }
+        for (int i = 0; i < list.getLength(); i++) {
+            Node node = list.item(i);
+            if (sdkName.equals(IWRTConstants.EMULATOR_NAME)) {
+                listofEmulators.put(sdkId, new Emulator(sdkId, node.getNodeValue()));
+            }
+        }
+    }
+
+    /**
+     * Returns the child list of the particular Node.
+     * @param parentNode
+     */
+    private static NodeList getChildNodes(Node parentNode) {
+        return parentNode.getChildNodes();
+    }
+
+}