/*
* Copyright 2012 the original author or authors.
*
* 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 org.gradle.api.plugins.buildcomparison.outcome.internal.archive.entry;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import org.gradle.util.ConfigureUtil;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class ArchiveEntry {
public static class Path implements Comparable<Path> {
private final String fullPath;
private final ImmutableList<String> components;
public Path(ImmutableList<String> components) {
this.fullPath = Joiner.on("!/").join(components);
this.components = components;
}
public int compareTo(Path o) {
for (int i = 0; i < Math.max(components.size(), o.components.size()); ++i) {
boolean hasLeft = components.size() > i;
boolean hasRight = o.components.size() > i;
if (!hasLeft && hasRight) {
return -1;
} else if (hasLeft && !hasRight) {
return 1;
} else {
int result = components.get(i).compareTo(o.components.get(i));
if (result != 0) {
return result;
}
}
}
return 0;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Path path = (Path) o;
if (!fullPath.equals(path.fullPath)) {
return false;
}
return true;
}
@Override
public int hashCode() {
return fullPath.hashCode();
}
@Override
public String toString() {
return fullPath;
}
}
private final Path path;
private final boolean directory;
private final long size;
private final long crc;
private final ImmutableSet<ArchiveEntry> subEntries;
private ArchiveEntry(Path path, boolean directory, long size, long crc, ImmutableSet<ArchiveEntry> subEntries) {
this.directory = directory;
this.size = size;
this.crc = crc;
this.subEntries = subEntries;
this.path = path;
}
public static ArchiveEntry of(Map<String, ?> map) {
return ConfigureUtil.configureByMap(map, new Builder()).build();
}
public Path getPath() {
return path;
}
public boolean isDirectory() {
return directory;
}
public long getSize() {
return size;
}
public long getCrc() {
return crc;
}
public ImmutableSet<ArchiveEntry> getSubEntries() {
return subEntries;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ArchiveEntry that = (ArchiveEntry) o;
if (!path.equals(that.path)) {
return false;
}
if (directory != that.directory) {
return false;
}
if (!subEntries.equals(that.subEntries)) {
return false;
}
if (subEntries.isEmpty()) {
if (crc != that.crc) {
return false;
}
if (size != that.size) {
return false;
}
} else {
return subEntries.equals(that.subEntries);
}
return true;
}
@Override
public int hashCode() {
int result = path != null ? path.hashCode() : 0;
result = 31 * result + (directory ? 1 : 0);
if (subEntries.isEmpty()) {
result = 31 * result + (int) (size ^ (size >>> 32));
result = 31 * result + (int) (crc ^ (crc >>> 32));
}
result = 31 * result + subEntries.hashCode();
return result;
}
@Override
public String toString() {
return "ArchiveEntry{"
+ ", path='" + path + '\''
+ ", directory=" + directory
+ ", size=" + size
+ ", crc=" + crc
+ ", subEntries=" + subEntries
+ '}';
}
public static class Builder {
private String path;
private boolean directory;
private long size;
private long crc;
private ImmutableSet<ArchiveEntry> subEntries = ImmutableSet.of();
private List<String> parentPaths = ImmutableList.of();
public String getPath() {
return path;
}
public boolean isDirectory() {
return directory;
}
public long getSize() {
return size;
}
public long getCrc() {
return crc;
}
public Collection<ArchiveEntry> getSubEntries() {
return subEntries;
}
public Builder setPath(String path) {
this.path = path;
return this;
}
public Builder setDirectory(boolean directory) {
this.directory = directory;
return this;
}
public Builder setSize(long size) {
this.size = size;
return this;
}
public Builder setCrc(long crc) {
this.crc = crc;
return this;
}
public Builder setSubEntries(ImmutableSet<ArchiveEntry> subEntries) {
this.subEntries = subEntries;
return this;
}
public void setParentPaths(List<String> parentPaths) {
this.parentPaths = parentPaths;
}
public ArchiveEntry build() {
if (path == null) {
throw new IllegalStateException("'path' is required");
}
if (subEntries == null) {
throw new IllegalStateException("'subEntries' is required");
}
if (directory && !subEntries.isEmpty()) {
throw new IllegalStateException("directory entry cannot have sub entries");
}
ImmutableList<String> parts = parentPaths.isEmpty() ? ImmutableList.of(path) : ImmutableList.<String>builder().addAll(parentPaths).add(path).build();
return new ArchiveEntry(new Path(parts), directory, size, crc, subEntries);
}
}
}