package com.hubspot.blazar.base; import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.PathMatcher; import java.util.Objects; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.hubspot.rosetta.annotations.StoredAsJson; public class Module { private final Optional<Integer> id; private final String name; private final String type; private final String path; private final String glob; private final PathMatcher matcher; private final boolean active; private final long createdTimestamp; private final long updatedTimestamp; @StoredAsJson private final Optional<GitInfo> buildpack; @StoredAsJson private final Optional<BuildConfig> buildConfig; @StoredAsJson private final Optional<BuildConfig> resolvedBuildConfig; @JsonCreator public Module(@JsonProperty("id") Optional<Integer> id, @JsonProperty("name") String name, @JsonProperty("type") String type, @JsonProperty("path") String path, @JsonProperty("glob") String glob, @JsonProperty("active") boolean active, @JsonProperty("createdTimestamp") long createdTimestamp, @JsonProperty("updatedTimestamp") long updatedTimestamp, @JsonProperty("buildpack") Optional<GitInfo> buildpack, @JsonProperty("buildConfig") Optional<BuildConfig> buildConfig, @JsonProperty("resolvedBuildConfig") Optional<BuildConfig> resolvedBuildConfig) { this.id = id; this.name = name; this.type = type; this.path = path; this.glob = Preconditions.checkNotNull(glob); this.matcher = FileSystems.getDefault().getPathMatcher("glob:" + glob); this.active = active; this.createdTimestamp = createdTimestamp; this.updatedTimestamp = updatedTimestamp; this.buildpack = MoreObjects.firstNonNull(buildpack, Optional.<GitInfo>absent()); this.buildConfig = MoreObjects.firstNonNull(buildConfig, Optional.absent()); this.resolvedBuildConfig = MoreObjects.firstNonNull(resolvedBuildConfig, Optional.absent()); } public Module(Optional<Integer> id, String name, String type, String path, String glob, boolean active, long createdTimestamp, long updatedTimestamp, Optional<GitInfo> buildpack) { this(id, name, type, path, glob, active, createdTimestamp, updatedTimestamp, buildpack, Optional.absent(), Optional.absent()); } public Optional<Integer> getId() { return id; } public String getName() { return name; } public String getType() { return type; } public String getPath() { return path; } @JsonIgnore public String getFolder() { return path.contains("/") ? path.substring(0, path.lastIndexOf('/')) : ""; } public String getGlob() { return glob; } public boolean isActive() { return active; } public long getCreatedTimestamp() { return createdTimestamp; } public long getUpdatedTimestamp() { return updatedTimestamp; } public Optional<GitInfo> getBuildpack() { return buildpack; } public Optional<BuildConfig> getBuildConfig() { return buildConfig; } public Optional<BuildConfig> getResolvedBuildConfig() { return resolvedBuildConfig; } public boolean contains(Path path) { return matcher.matches(path); } public Module withId(int id) { return new Module(Optional.of(id), name, type, path, glob, active, createdTimestamp, updatedTimestamp, buildpack, buildConfig, resolvedBuildConfig); } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("id", id) .add("name", name) .add("type", type) .add("path", path) .add("glob", glob) .add("buildpack", buildpack) .add("buildConfig", buildConfig) .add("resolvedBuildConfig", resolvedBuildConfig) .toString(); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Module module = (Module) o; return Objects.equals(active, module.active) && Objects.equals(id, module.id) && Objects.equals(name, module.name) && Objects.equals(type, module.type) && Objects.equals(path, module.path) && Objects.equals(glob, module.glob) && Objects.equals(buildpack, module.buildpack) && Objects.equals(buildConfig, module.getBuildConfig()) && Objects.equals(resolvedBuildConfig, module.getResolvedBuildConfig()); } @Override public int hashCode() { return Objects.hash(id, name, type, path, glob, active, buildpack, buildConfig, resolvedBuildConfig); } }