All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.uiautomation.ios.inspector.controllers.TreeController Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2012-2013 eBay Software Foundation and ios-driver committers
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package org.uiautomation.ios.inspector.controllers;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.openqa.selenium.WebDriverException;
import org.uiautomation.ios.UIAModels.Session;
import org.uiautomation.ios.inspector.model.Cache;
import org.uiautomation.ios.inspector.model.IDESessionModel;
import org.uiautomation.ios.inspector.views.JSONView;
import org.uiautomation.ios.inspector.views.View;
import org.uiautomation.ios.utils.JSONToXMLConvertor;

import javax.servlet.http.HttpServletRequest;

public class TreeController implements IDECommandController {

  private final Cache cache;

  public TreeController(Cache cache) {
    this.cache = cache;
  }

  @Override
  public boolean canHandle(String pathInfo) {
    return pathInfo.endsWith("/tree");
  }

  @Override
  public View handle(HttpServletRequest req) throws Exception {
    final Session s = new Session(extractSession(req.getPathInfo()));
    IDESessionModel model = cache.getModel(s);
    // if no 1 sec delay
    Thread.sleep(200);
    model.refresh();
    JSONObject rootNode = model.getTree().getJSONObject("tree");
    JSONToXMLConvertor conv = new JSONToXMLConvertor(rootNode);
    JSONObject jsTreeObject = createFrom(rootNode, conv.asXML());
    return new JSONView(jsTreeObject);

  }

  private JSONObject createFrom(JSONObject from, String xml) throws JSONException {
    JSONObject node = new JSONObject();

    node.put("data", getNodeTitle(from));
    node.put("id", getNodeTitle(from));

    // add an id to the node to make them selectable by :reference
    JSONObject attr = new JSONObject();
    attr.put("id", from.getString("ref"));
    node.put("attr", attr);

    JSONObject metadata = new JSONObject();
    if (xml != null) {
      metadata.put("xml", xml);
    }

    metadata.put("type", from.getString("type"));
    metadata.put("reference", from.getString("ref"));
    metadata.put("label", from.getString("label"));
    metadata.put("name", from.getString("name"));
    metadata.put("value", from.getString("value"));
    if (from.has("l10n")) {
      metadata.put("l10n", from.getJSONObject("l10n"));
    } else {
      metadata.put("l10n", new JSONObject().put("matches", 0));
    }
    if (from.has("source")) {
      metadata.put("source", from.getString("source"));
    }

    node.put("metadata", metadata);
    JSONObject rect = new JSONObject();
    rect.put("x", from.getJSONObject("rect").getJSONObject("origin").getInt("x"));
    rect.put("y", from.getJSONObject("rect").getJSONObject("origin").getInt("y"));
    rect.put("h", from.getJSONObject("rect").getJSONObject("size").getInt("height"));
    rect.put("w", from.getJSONObject("rect").getJSONObject("size").getInt("width"));
    metadata.put("rect", rect);

    JSONArray children = from.optJSONArray("children");

    if (children != null && children.length() != 0) {
      JSONArray jstreeChildren = new JSONArray();
      node.put("children", jstreeChildren);
      for (int i = 0; i < children.length(); i++) {
        JSONObject child = children.getJSONObject(i);
        JSONObject jstreenode = createFrom(child, null);
        jstreeChildren.put(jstreenode);
      }
    }

    boolean keyBoardVisible = hasKeyBoard(node);
    metadata.put("keyboard", keyBoardVisible);
    return node;
  }

  private boolean hasKeyBoard(JSONObject node) {
    String type = node.optJSONObject("metadata").optString("type");
    if ("UIAKeyboard".equals(type)) {
      return true;
    } else {
      if (node.has("children")) {
        JSONArray children = node.optJSONArray("children");
        for (int i = 0; i < children.length(); i++) {
          JSONObject child = children.optJSONObject(i);
          boolean res = hasKeyBoard(child);
          if (res) {
            return res;
          }
        }
      }
    }
    return false;
  }


  private String getNodeTitle(JSONObject node) throws JSONException {
    StringBuilder b = new StringBuilder();
    b.append("[" + node.getString("type") + "]-");

    String name = node.optString("name");
    String value = node.optString("value");
    String label = node.optString("label");

    if (name != null) {
      if (name.length() > 18) {
        name = name.substring(0, 15) + "...";
      }
      b.append(name);
    }
    return b.toString();

  }

  private String extractSession(String pathInfo) {

    if (pathInfo.startsWith("/session/")) {
      String tmp = pathInfo.replace("/session/", "");
      if (tmp.contains("/")) {
        return tmp.split("/")[0];
      } else {
        return tmp;
      }
    } else {
      throw new WebDriverException("cannot extract session id from " + pathInfo);
    }
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy