forked from docker-java/docker-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNameParser.java
More file actions
153 lines (123 loc) · 5.17 KB
/
Copy pathNameParser.java
File metadata and controls
153 lines (123 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
* Copyright (C) 2014 SignalFuse, Inc.
*/
package com.github.dockerjava.core;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.core.exception.InvalidRepositoryNameException;
@SuppressWarnings(value = "checkstyle:equalshashcode")
public class NameParser {
private NameParser() {
}
// CHECKSTYLE:OFF
private static final int RepositoryNameTotalLengthMax = 255;
private static final String SHA256_SEPARATOR = "@sha256:";
private static final Pattern RepositoryNameComponentRegexp = Pattern.compile("[a-z0-9]+(?:[._-][a-z0-9]+)*");
private static final Pattern RepositoryNameComponentAnchoredRegexp = Pattern.compile("^"
+ RepositoryNameComponentRegexp.pattern() + "$");
// CHECKSTYLE:ON
// private static final Pattern RepositoryNameRegexp = Pattern.compile("(?:" +
// RepositoryNameComponentRegexp.pattern()
// + "/)*" + RepositoryNameComponentRegexp.pattern());
public static ReposTag parseRepositoryTag(String name) {
int n = name.lastIndexOf(':');
if (n < 0) {
return new ReposTag(name, "");
}
String tag = name.substring(n + 1);
if (StringUtils.containsIgnoreCase(name, SHA256_SEPARATOR)) {
return new ReposTag(name, "");
}
if (!tag.contains("/")) {
return new ReposTag(name.substring(0, n), tag);
}
return new ReposTag(name, "");
}
public static class ReposTag {
public final String repos;
public final String tag;
public ReposTag(String repos, String tag) {
this.repos = repos;
this.tag = tag;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ReposTag) {
ReposTag other = (ReposTag) obj;
return new EqualsBuilder().append(repos, other.repos).append(tag, other.tag).isEquals();
} else {
return false;
}
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
}
}
/*
* see https://github.com/docker/distribution/blob/master/registry/api/v2/names.go
*/
public static void validateRepoName(String name) {
if (name.isEmpty()) {
throw new InvalidRepositoryNameException(String.format("Invalid empty repository name \"%s\"", name));
}
if (name.length() > RepositoryNameTotalLengthMax) {
throw new InvalidRepositoryNameException(String.format("Repository name \"%s\" is longer than "
+ RepositoryNameTotalLengthMax, name));
}
String[] components = name.split("/");
for (String component : components) {
if (!RepositoryNameComponentAnchoredRegexp.matcher(component).matches()) {
throw new InvalidRepositoryNameException(String.format(
"Repository name \"%s\" is invalid. Component: %s", name, component));
}
}
}
public static HostnameReposName resolveRepositoryName(String reposName) {
if (reposName.contains("://")) {
throw new InvalidRepositoryNameException("RepositoryName shouldn't contain a scheme");
}
String[] nameParts = reposName.split("/", 2);
if (nameParts.length == 1
|| (!nameParts[0].contains(".") && !nameParts[0].contains(":") && !nameParts[0].equals("localhost"))) {
return new HostnameReposName(AuthConfig.DEFAULT_SERVER_ADDRESS, reposName);
}
String hostname = nameParts[0];
reposName = nameParts[1];
if (hostname.contains("index.docker.io")) {
throw new InvalidRepositoryNameException(String.format("Invalid repository name, try \"%s\" instead",
reposName));
}
if (StringUtils.containsIgnoreCase(reposName, SHA256_SEPARATOR)) {
reposName = StringUtils.substringBeforeLast(reposName, SHA256_SEPARATOR);
}
validateRepoName(reposName);
return new HostnameReposName(hostname, reposName);
}
public static class HostnameReposName {
public final String hostname;
public final String reposName;
public HostnameReposName(String hostname, String reposName) {
this.hostname = hostname;
this.reposName = reposName;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof HostnameReposName) {
HostnameReposName other = (HostnameReposName) obj;
return new EqualsBuilder().append(hostname, other.hostname).append(reposName, other.reposName)
.isEquals();
} else {
return false;
}
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.SIMPLE_STYLE);
}
}
}