/**
   * Resolve the dependencies. Copies jars to the impl/lib part of the bundle and file/directory
   * dependencies to the bundle.
   *
   * @param config context configuration
   * @throws IOException
   * @throws URISyntaxException
   */
  public void resolveDependencies(Map<String, Object> config)
      throws IOException, URISyntaxException {
    for (BOperatorInvocation op : operatorToJarDependencies.keySet()) {
      ArrayList<String> jars = new ArrayList<String>();

      for (Path pa : operatorToJarDependencies.get(op)) {
        String jarName = resolveDependency(pa, config);
        jars.add("impl/lib/" + jarName);
      }

      String[] jarPaths = jars.toArray(new String[jars.size()]);
      op.setParameter("jar", jarPaths);
    }

    ArrayList<String> jars = new ArrayList<String>();
    for (Path dep : globalDependencies) {
      if (previouslyCopiedDependencies.containsKey(dep)) {
        continue;
      }
      String jarName = resolveDependency(dep, config);
      jars.add("impl/lib/" + jarName);
    }

    List<BOperator> ops = topology.builder().getOps();
    if (jars.size() != 0) {
      for (BOperator op : ops) {
        if (op instanceof BOperatorInvocation) {
          BOperatorInvocation bop = (BOperatorInvocation) op;
          if (Functional.class.isAssignableFrom(bop.op().getOperatorClass())) {
            JSONObject params = (JSONObject) bop.json().get("parameters");
            JSONObject op_jars = (JSONObject) params.get("jar");
            if (null == op_jars) {
              JSONObject val = new OrderedJSONObject();
              val.put("value", new JSONArray());
              params.put("jar", val);
              op_jars = val;
            }
            JSONArray value = (JSONArray) op_jars.get("value");
            for (String jar : jars) {
              value.add(jar);
            }
          }
        }
      }
    }

    for (Artifact dep : globalFileDependencies) resolveFileDependency(dep, config);
  }
 protected SPLStream addMatchingOutput(BOperatorInvocation bop, Type tupleType) {
   return new SPLStreamImpl(this, bop.addOutput(getSchema()));
 }