/*************************GO-LICENSE-START*********************************
* Copyright 2014 ThoughtWorks, Inc.
*
* 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.
*************************GO-LICENSE-END***********************************/
package com.thoughtworks.go.domain;
import com.thoughtworks.go.config.ConfigAttributeValue;
import java.net.URI;
import java.net.URISyntaxException;
@ConfigAttributeValue(fieldName = "url")
public class ServerSiteUrlConfig {
private static final String HTTPS_URL_REGEX = "^https://.+";
protected String url;
public ServerSiteUrlConfig() {
}
public ServerSiteUrlConfig(String url) {
this.url = url;
}
public boolean hasNonNullUrl() {
return getUrl() != null;
}
public String getUrl() {
return url;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o.getClass().equals(this.getClass()))) {
return false;
}
ServerSiteUrlConfig that = (ServerSiteUrlConfig) o;
if (url != null ? !url.equals(that.url) : that.url != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
return url != null ? url.hashCode() : 0;
}
public String siteUrlFor(String givenUrl) throws URISyntaxException {
return siteUrlFor(givenUrl, false);
}
public String siteUrlFor(String givenUrl, boolean honorGivenHostName) throws URISyntaxException {
if (url == null || isPath(givenUrl)) {
return givenUrl; //it is a path
}
URI baseUri = new URI(url);
URI givenUri = new URI(givenUrl);
return new URI(baseUri.getScheme(), getOrDefault(givenUri, baseUri, new Getter() {
public String get(URI uri) {
return uri.getUserInfo();
}
}), honorGivenHostName ? givenUri.getHost() : baseUri.getHost(), baseUri.getPort(), getOrDefault(givenUri, baseUri, new Getter() {
public String get(URI uri) {
return uri.getPath();
}
}), getOrDefault(givenUri, baseUri, new Getter() {
public String get(URI uri) {
return uri.getQuery();
}
}), getOrDefault(givenUri, baseUri, new Getter() {
public String get(URI uri) {
return uri.getFragment();
}
})).toString();
}
private boolean isPath(String givenUrl) {
return !givenUrl.matches("^https?://.+");
}
private String getOrDefault(URI givenUri, URI baseUri, Getter getter) {
String given = getter.get(givenUri);
return given == null ? getter.get(baseUri) : given;
}
public boolean isAHttpsUrl() {
return url != null && url.matches( HTTPS_URL_REGEX);
}
interface Getter {
String get(URI uri);
}
@Override
public String toString() {
return hasNonNullUrl() ? url: "";
}
}