@Override
  public List<Table> getTableList(UUID subscriptionId, String serviceName)
      throws AzureCmdException {

    String[] cmd =
        new String[] {
          "mobile", "table", "list", "--json", "-s", subscriptionId.toString(), serviceName
        };

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, String>> tempRes = (List<Map<String, String>>) slurper.parseText(json);

    List<Table> res = new ArrayList<Table>();
    for (Map<String, String> item : tempRes) {
      Table t = new Table();
      t.setName(item.get("name"));
      t.setSelfLink(item.get("selflink"));

      res.add(t);
    }

    return res;
  }
  public List<SqlDb> getSqlDb(
      UUID subscriptionId, String serverName, String admin, String adminPassword)
      throws AzureCmdException {
    String[] cmd =
        new String[] {
          "sql",
          "db",
          "list",
          "--json",
          "-s",
          subscriptionId.toString(),
          serverName,
          admin,
          adminPassword
        };

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, String>> tempRes = (List<Map<String, String>>) slurper.parseText(json);

    List<SqlDb> res = new ArrayList<SqlDb>();
    for (Map<String, String> item : tempRes) {

      SqlDb sqls = new SqlDb();
      sqls.setName(item.get("Name"));
      sqls.setEdition(item.get("Edition"));
      res.add(sqls);
    }

    return res;
  }
  @Override
  public List<Job> listJobs(UUID subscriptionId, String serviceName) throws AzureCmdException {
    String[] cmd =
        new String[] {
          "mobile", "job", "list", "--json", "-s", subscriptionId.toString(), serviceName,
        };

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, Object>> tempRes = (List<Map<String, Object>>) slurper.parseText(json);

    List<Job> res = new ArrayList<Job>();
    for (Map<String, Object> item : tempRes) {
      Job j = new Job();
      j.setAppName(item.get("appName").toString());
      j.setName(item.get("name").toString());
      j.setEnabled(item.get("status").equals("enabled"));
      j.setId(UUID.fromString(item.get("id").toString()));

      if (item.get("intervalPeriod") != null) {
        j.setIntervalPeriod((Integer) item.get("intervalPeriod"));
        j.setIntervalUnit(item.get("intervalUnit").toString());
      }

      res.add(j);
    }

    return res;
  }
  public List<String> getLocations(UUID subscriptionId) throws AzureCmdException {
    String[] cmd = new String[] {"mobile", "locations", "--json"};

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, String>> tempRes = (List<Map<String, String>>) slurper.parseText(json);

    List<String> res = new ArrayList<String>();
    for (Map<String, String> item : tempRes) {
      res.add(item.get("region"));
    }

    return res;
  }
  public List<String> listFirewallIP(String serverName) throws AzureCmdException {
    String[] cmd =
        new String[] {
          "sql", "firewallrule", "list", "--json", "--serverName", serverName,
        };

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);
    CustomJsonSlurper slurper = new CustomJsonSlurper();

    List<Map<String, Object>> tempRes = (List<Map<String, Object>>) slurper.parseText(json);

    List<String> res = new ArrayList<String>();
    for (Map<String, Object> item : tempRes) res.add(item.get("name").toString());

    return res;
  }
  @Override
  public List<LogEntry> listLog(UUID subscriptionId, String serviceName)
      throws AzureCmdException, ParseException {
    String[] cmd =
        new String[] {
          "mobile", "log", "--json", "-s", subscriptionId.toString(), serviceName,
        };

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();

    Map<String, Object> results = (Map<String, Object>) slurper.parseText(json);
    List<Map<String, String>> tempRes = (List<Map<String, String>>) results.get("results");

    List<LogEntry> res = new ArrayList<LogEntry>();
    for (Map<String, String> item : tempRes) {
      LogEntry logEntry = new LogEntry();

      logEntry.setMessage(item.get("message"));
      logEntry.setSource(item.get("source"));
      logEntry.setType(item.get("type"));

      SimpleDateFormat ISO8601DATEFORMAT =
          new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
      logEntry.setTimeCreated(ISO8601DATEFORMAT.parse(item.get("timeCreated")));

      res.add(logEntry);
    }

    return res;
  }
  @Override
  public List<CustomAPI> getAPIList(UUID subscriptionId, String serviceName)
      throws AzureCmdException {

    String[] cmd =
        new String[] {
          "mobile", "api", "list", "--json", "-s", subscriptionId.toString(), serviceName
        };

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, String>> tempRes = (List<Map<String, String>>) slurper.parseText(json);

    List<CustomAPI> res = new ArrayList<CustomAPI>();
    for (Map<String, String> item : tempRes) {
      CustomAPI c = new CustomAPI();
      c.setName(item.get("name"));
      CustomAPIPermissions permissions = new CustomAPIPermissions();
      permissions.setPutPermission(PermissionItem.getPermitionType(item.get("put")));
      permissions.setPostPermission(PermissionItem.getPermitionType(item.get("post")));
      permissions.setGetPermission(PermissionItem.getPermitionType(item.get("get")));
      permissions.setDeletePermission(PermissionItem.getPermitionType(item.get("delete")));
      permissions.setPatchPermission(PermissionItem.getPermitionType(item.get("patch")));
      c.setCustomAPIPermissions(permissions);
      res.add(c);
    }

    return res;
  }
  @Override
  public ArrayList<Subscription> getSubscriptionList() throws AzureCmdException {

    String[] cmd = new String[] {"account", "list", "--json"};

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, Object>> tempRes = (List<Map<String, Object>>) slurper.parseText(json);

    ArrayList<Subscription> res = new ArrayList<Subscription>();
    for (Map<String, Object> item : tempRes) {
      Subscription s = new Subscription();
      s.setId(UUID.fromString(item.get("id").toString()));
      s.setName(item.get("name").toString());
      s.setCurrent((Boolean) item.get("isDefault"));

      res.add(s);
    }

    return res;
  }
  @Override
  public List<SqlServer> getSqlServers(UUID subscriptionId) throws AzureCmdException {
    String[] cmd =
        new String[] {"sql", "server", "list", "--json", "-s", subscriptionId.toString()};

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, String>> tempRes = (List<Map<String, String>>) slurper.parseText(json);

    List<SqlServer> res = new ArrayList<SqlServer>();
    for (Map<String, String> item : tempRes) {

      SqlServer sqls = new SqlServer();
      sqls.setAdmin(item.get("administratorUserName"));
      sqls.setName(item.get("name"));
      sqls.setRegion(item.get("location"));
      res.add(sqls);
    }

    return res;
  }
  @Override
  public Table showTableDetails(UUID subscriptionId, String serviceName, String tableName)
      throws AzureCmdException {
    String[] cmd =
        new String[] {
          "mobile",
          "table",
          "show",
          "--json",
          "-s",
          subscriptionId.toString(),
          serviceName,
          tableName
        };

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    Map<String, Object> tempRes = (Map<String, Object>) slurper.parseText(json);

    Table t = new Table();

    Map<String, Object> tableData = (Map<String, Object>) tempRes.get("table");
    t.setName(tableData.get("name").toString());
    t.setSelfLink(tableData.get("selflink").toString());

    Map<String, String> per = (Map<String, String>) tempRes.get("permissions");

    TablePermissions tablePermissions = new TablePermissions();
    tablePermissions.setInsert(PermissionItem.getPermitionType(per.get("insert")));
    tablePermissions.setUpdate(PermissionItem.getPermitionType(per.get("update")));
    tablePermissions.setRead(PermissionItem.getPermitionType(per.get("read")));
    tablePermissions.setDelete(PermissionItem.getPermitionType(per.get("delete")));
    t.setTablePermissions(tablePermissions);

    for (Map<String, Object> column : (List<Map<String, Object>>) tempRes.get("columns")) {
      Column c = new Column();
      c.setName(column.get("name").toString());
      c.setType(column.get("type").toString());
      c.setSelfLink(column.get("selflink").toString());
      c.setIndexed((Boolean) column.get("indexed"));
      c.setZumoIndex((Boolean) column.get("zumoIndex"));

      t.getColumns().add(c);
    }

    for (Map<String, Object> script : (List<Map<String, Object>>) tempRes.get("scripts")) {
      Script s = new Script();

      s.setOperation(script.get("operation").toString());
      s.setBytes((Integer) script.get("sizeBytes"));
      s.setSelfLink(script.get("selflink").toString());
      s.setName(String.format("%s.%s", tableData.get("name"), script.get("operation").toString()));

      t.getScripts().add(s);
    }

    return t;
  }
  @Override
  public List<Service> getServiceList(UUID subscriptionId) throws AzureCmdException {

    String[] cmd = new String[] {"mobile", "list", "--json", "-s", subscriptionId.toString()};

    String json = AzureCommandHelper.getInstance().consoleExec(cmd);

    CustomJsonSlurper slurper = new CustomJsonSlurper();
    List<Map<String, Object>> tempRes = (List<Map<String, Object>>) slurper.parseText(json);

    List<Service> res = new ArrayList<Service>();
    for (Map<String, Object> item : tempRes) {
      Service ser = new Service();

      ser.setName((String) item.get("name"));
      ser.setType((String) item.get("type"));
      ser.setState((String) item.get("state"));
      ser.setSelfLink((String) item.get("selflink"));
      ser.setAppUrl((String) item.get("applicationUrl"));
      ser.setAppKey((String) item.get("applicationKey"));
      ser.setMasterKey((String) item.get("masterKey"));
      ser.setWebspace((String) item.get("webspace"));
      ser.setRegion((String) item.get("region"));
      ser.setMgmtPortalLink((String) item.get("managementPortalLink"));
      ser.setSubcriptionId(subscriptionId);

      for (Map<String, String> table : (List<Map<String, String>>) item.get("tables")) {
        Table t = new Table();
        t.setName(table.get("name"));
        t.setSelfLink(table.get("selflink"));
        ser.getTables().add(t);
      }
      res.add(ser);
    }

    return res;
  }