public ExternalTaskFactory(Repository repository, TaskInformation information) {
    super(repository);
    this.output = new ValueType(information.output);
    this.pathArguments = information.pathArguments;
    this.prefixes = information.prefixes;
    this.constants = information.constants;
    this.id = information.id;
    if (information.id == null) throw new AssertionError("Task ID is not defined");

    // Add inputs
    for (Map.Entry<String, InputInformation> entry : information.inputs.entrySet()) {
      String name = entry.getKey();
      final InputInformation field = entry.getValue();

      Input input = new JsonInput(getType(field));
      input.setDocumentation(field.help);
      input.setOptional(!field.required);
      input.setCopyTo(field.copyTo);
      input.nestedDependencies(field.dependencies);
      if (field.defaultvalue != null && !field.defaultvalue.isJsonNull()) {
        input.setDefaultValue(Json.toJSON(field.defaultvalue));
      }
      inputs.put(name, input);
    }

    // Add paths
    for (PathArgument pathArgument : information.pathArguments) {
      Input input = new JsonInput(Type.XP_PATH);
      input.setOptional(true); // We are lying -- we will set it!
      inputs.put(pathArgument.jsonName, input);
    }
  }
  /**
   * @param commands
   * @param element
   * @param levels Recursiion levels
   */
  public void fillDependencies(Commands commands, Json element, int levels) {
    if (element == null) {
      return;
    }

    if (element instanceof JsonObject) {
      JsonObject object = (JsonObject) element;

      final Json r = object.get(Constants.XP_RESOURCE.toString());
      if (r == null) {
        if (levels > 1) {
          object.values().forEach(j -> fillDependencies(commands, j, levels - 1));
        }
        // Just stop
        return;
      }

      final Object o = r.get();
      Resource resource;
      if (o instanceof Resource) {
        resource = (Resource) o;
      } else {
        try {
          resource = Resource.getByLocator(NetworkShare.uriToPath(o.toString()));
        } catch (SQLException e) {
          throw new XPMRuntimeException(
              e,
              "Error while searching the resource %s the task %s depends upon",
              o.toString(),
              getId());
        }
        if (resource == null) {
          throw new XPMRuntimeException(
              "Cannot find the resource %s the task %s depends upon", o.toString(), getId());
        }
      }
      final Dependency lock = resource.createDependency((DependencyParameters) null);
      commands.addDependency(lock);
    } else if (element instanceof JsonArray) {
      if (levels > 1) {
        ((JsonArray) element).forEach(j -> fillDependencies(commands, j, levels - 1));
      }
    }
  }
Пример #3
0
  @Override
  public void validate(Json element) throws ValueMismatchException {
    // Check if this is an array
    if (!(element instanceof JsonArray))
      throw new XPMRuntimeException("Expected an array and got " + element.getClass());

    // Check every element
    JsonArray array = (JsonArray) element;
    int i = 0;
    for (Json json : array) {
      try {
        innerType.validate(json);
        ++i;
      } catch (ValueMismatchException e) {
        e.addContext("While validating element %d of array of type %s", i, innerType);
        throw e;
      }
    }
  }