/******************************************************************************* * Copyright (c) 2014, 2017 Red Hat. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat - Initial Contribution *******************************************************************************/ package org.eclipse.linuxtools.internal.docker.core; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE; import org.eclipse.linuxtools.docker.core.IRepositoryTag; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.base.MoreObjects; /** * Repository tag retrieved from Docker Registry version 0.6.3 * */ @JsonAutoDetect(fieldVisibility = ANY, getterVisibility = NONE, setterVisibility = NONE) public class RepositoryTag implements IRepositoryTag, Comparable<IRepositoryTag> { @JsonProperty("layer") //$NON-NLS-1$ private String layer; @JsonProperty("name") //$NON-NLS-1$ private String name; /** * Default constructor */ public RepositoryTag() { } /** * Full constructor. * @param name * the repository name * @param layer * the layer */ public RepositoryTag(final String name, final String layer) { this.layer = layer; this.name = name; } /** * @return the layer */ @Override public String getLayer() { return layer; } /** * @param layer * the layer to set */ public void setLayer(String layer) { this.layer = layer; } /** * @return the name */ @Override public String getName() { return name; } /** * @param name * the name to set */ public void setName(String name) { this.name = name; } @Override public String toString() { return MoreObjects.toStringHelper(this).add("name", getName()) //$NON-NLS-1$ .add("layer", getLayer()).toString(); //$NON-NLS-1$ } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((layer == null) ? 0 : layer.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } RepositoryTag other = (RepositoryTag) obj; if (layer == null) { if (other.layer != null) { return false; } } else if (!layer.equals(other.layer)) { return false; } if (name == null) { if (other.name != null) { return false; } } else if (!name.equals(other.name)) { return false; } return true; } /** * Compares by the tag 'name' in reverse order. */ @Override public int compareTo(final IRepositoryTag other) { // TODO: put this in IRepositoryTag in the next major release. // tries to compare versions in the x.y.z.qualifer format, otherwise, // just do a lexicographical comparison try { final String[] thisParts = this.getName().split("\\."); //$NON-NLS-1$ final String[] thatParts = other.getName().split("\\."); //$NON-NLS-1$ int length = Math.max(thisParts.length, thatParts.length); for (int i = 0; i < length; i++) { int thisPart = i < thisParts.length ? Integer.parseInt(thisParts[i]) : 0; int thatPart = i < thatParts.length ? Integer.parseInt(thatParts[i]) : 0; if (thisPart < thatPart) { return 1; } if (thisPart > thatPart) { return -1; } } return 0; } catch (NumberFormatException e) { // if one of the name was not a valid version, just do this: return other.getName().compareTo(this.getName()); } } }