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

azkaban.spi.Dependency Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2019 LinkedIn Corp.
 *
 * 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 azkaban.spi;

import azkaban.utils.HashUtils;
import azkaban.utils.InvalidHashException;
import java.io.File;
import java.util.Map;
import java.util.Objects;
import org.codehaus.jackson.annotate.JsonProperty;

/**
 * Representation of startup dependency. Maps 1:1 to an entry in startup-dependencies.json for thin archives.
 * Will automatically validate SHA1 checksum upon instantiation to avoid SQL injection when this checksum is used
 * for DB queries, as well as mitigating other issues down the road.
 */
public class Dependency {
  private final String fileName;
  private final String destination;
  private final String type;
  private final String ivyCoordinates;
  private final String sha1;

  public Dependency(final String fileName, final String destination, final String type, final String ivyCoordinates,
      final String sha1) throws InvalidHashException {
    this.fileName = fileName;
    this.destination = destination;
    this.type = type;
    this.ivyCoordinates = ivyCoordinates;
    this.sha1 = HashUtils.SHA1.sanitizeHashStr(sha1);
  }

  public Dependency(final Map fieldMap) throws InvalidHashException {
    this(fieldMap.get("file"), fieldMap.get("destination"), fieldMap.get("type"), fieldMap.get("ivyCoordinates"),
        fieldMap.get("sha1"));
  }

  /**
   * Make a copy of this dependency
   *
   * @return a copy of this dependency
   */
  public Dependency copy() {
    try {
      return new Dependency(getFileName(), getDestination(), getType(), getIvyCoordinates(), getSHA1());
    } catch (InvalidHashException e) {
      // This should never happen because we already validated the hash when creating this dependency
      throw new RuntimeException("InvalidHashException when copying dependency.");
    }
  }

  /**
   * Make a new DependencyFile with the same details as this dependency
   *
   * @param file for DependencyFile
   * @return the new DependencyFile
   */
  public DependencyFile makeDependencyFile(final File file) {
    try {
      return new DependencyFile(file, getFileName(), getDestination(), getType(), getIvyCoordinates(), getSHA1());
    } catch (InvalidHashException e) {
      // This should never happen because we already validated the hash when creating this dependency
      throw new RuntimeException("InvalidHashException when copying dependency.");
    }
  }

  // it makes much more sense for the getter to be getFileName vs getFile, but in the startup-dependencies.json
  // spec we expect the property to be "file" not "fileName" so we have to annotate this to tell the JSON serializer
  // to insert it with "file", instead of assuming the name based on the name of the getter like it usually does.
  @JsonProperty("file")
  public String getFileName() { return this.fileName; }

  public String getDestination() { return this.destination; }
  public String getType() { return this.type; }
  public String getIvyCoordinates() { return this.ivyCoordinates; }
  public String getSHA1() { return this.sha1; }

  @Override
  public boolean equals(final Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Dependency that = (Dependency) o;
    return this.fileName.equals(that.fileName) && this.type.equals(that.type) && this.ivyCoordinates.equals(that.ivyCoordinates)
        && this.sha1.equals(that.sha1);
  }

  @Override
  public int hashCode() {
    return Objects.hash(this.sha1);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy