All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.openshift.internal.client.response.Link Maven / Gradle / Ivy

The newest version!
/******************************************************************************* 
 * Copyright (c) 2012 Red Hat, Inc. 
 * Distributed under license by Red Hat, Inc. All rights reserved. 
 * This program is 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, Inc. - initial API and implementation 
 ******************************************************************************/
package com.openshift.internal.client.response;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.openshift.client.HttpMethod;
import com.openshift.client.IHttpClient;
import com.openshift.client.OpenShiftException;
import com.openshift.client.OpenShiftRequestException;
import com.openshift.internal.client.httpclient.EncodingException;
import com.openshift.internal.client.httpclient.request.FormUrlEncodedMediaType;
import com.openshift.internal.client.httpclient.request.Parameter;
import com.openshift.internal.client.httpclient.request.ParameterValueMap;
import com.openshift.internal.client.utils.StringUtils;
import com.openshift.internal.client.utils.UrlUtils;

/**
 * The Class Link.
 * 
 * @author Xavier Coulon
 */
public class Link {

	private final Pattern PATH_VAR_PATTERN = Pattern.compile(":([a-z_]+)");

	/** The related resource (destination) this link points to */
	private final String rel;

	/** The url/href this link point to. */
	private final String href;

	/** The http method that this link operates on. */
	private final HttpMethod httpMethod;

	/** The required params of this link. */
	private final List requiredParams;

	/** The optional params of this link. */
	private final List optionalParams;

	public Link(final String href, final HttpMethod httpMethod) {
		this(null, href, httpMethod);
	}

	public Link(final String rel, final String href, final HttpMethod httpMethod) {
		this(rel, href, httpMethod, null, null);
	}

	protected Link(final String rel, final String href, final String httpMethod,
			final List requiredParams, final List optionalParams) {
		this(rel, href, HttpMethod.valueOf(httpMethod), requiredParams, optionalParams);
	}

	/**
	 * Instantiates a new Link object.
	 * 
	 * @param rel
	 *            the related resource this link points to
	 * @param href
	 *            the href the url/href this link points to
	 * @param httpMethod
	 *            the http method that this link operates on
	 * @param requiredParams
	 *            the required params
	 * @param optionalParams
	 *            the optional params
	 */
	protected Link(final String rel, final String href, final HttpMethod httpMethod,
			final List requiredParams, final List optionalParams) {
		this.rel = rel;
		this.href = href;
		this.httpMethod = httpMethod;
		this.requiredParams = requiredParams;
		this.optionalParams = optionalParams;
	}

	/**
	 * Gets the related resource (destination) this link points to.
	 * 
	 * @return the rel
	 */
	public final String getRel() {
		return rel;
	}

	/**
	 * Gets the url/href this link points to.
	 * 
	 * @return the href
	 */
	public final String getHref() {
		return href;
	}

	public final String getHref(String server, String servicePath, Parameter... urlParameters) {
		return addParameters(ensureAbsoluteUrl(href, server, servicePath), urlParameters);
	}

	public final String getHref(String server, String servicePath, List urlPathParameters,
			List urlParameters) {
		String url = substituteUrlPathParameters(href, urlPathParameters);
		return addParameters(ensureAbsoluteUrl(url, server, servicePath), urlParameters);
	}

	/**
	 * Gets the http method this link operates on.
	 * 
	 * @return the httpMethod
	 */
	public final HttpMethod getHttpMethod() {
		return httpMethod;
	}

	/**
	 * Gets the required params.
	 * 
	 * @return the requiredParams
	 */
	public final List getRequiredParams() {
		return requiredParams;
	}

	/**
	 * Gets the optional params.
	 * 
	 * @return the optionalParams
	 */
	public final List getOptionalParams() {
		return optionalParams;
	}

	public boolean hasParameter(String name) {
		if (getParameter(name, requiredParams) != null) {
			return true;
		} else if (getParameter(name, optionalParams) != null) {
			return true;
		}
		return false;
	}

	public void validateRequestParameters(Parameter[] parameters)
			throws OpenShiftRequestException {
		if (getRequiredParams() != null) {
			for (LinkParameter requiredParameter : getRequiredParams()) {
				validateRequiredParameter(requiredParameter, parameters);
			}
		}
		if (getOptionalParams() != null) {
			for (LinkParameter optionalParameter : getOptionalParams()) {
				validateOptionalParameters(optionalParameter);
			}
		}
	}

	private void validateRequiredParameter(LinkParameter linkParameter, Parameter[] parameters)
			throws OpenShiftRequestException {
		Parameter parameter = getParameter(linkParameter.getName(), parameters);
		if (parameter == null) {
			throw new OpenShiftRequestException(
					"Requesting {0}: required request parameter \"{1}\" is missing", getHref(),
					linkParameter.getName());
		}

		if (isEmptyString(linkParameter, parameter.getValue())) {
			throw new OpenShiftRequestException("Requesting {0}: required request parameter \"{1}\" is empty",
					getHref(), linkParameter.getName());
		}
		// TODO: check valid options (still reported in a very incosistent way)
	}

	private Parameter getParameter(String name, Parameter[] parameters) {
		if (StringUtils.isEmpty(name)
				|| parameters == null) {
			return null;
		}
		for (Parameter parameter : parameters) {
			if (name.equals(parameter.getName())) {
				return parameter;
			}
		}
		return null;
	}

	private LinkParameter getParameter(String name, List parameters) {
		if (StringUtils.isEmpty(name)
				|| parameters == null) {
			return null;
		}
		for (LinkParameter parameter : parameters) {
			if (name.equals(parameter.getName())) {
				return parameter;
			}
		}
		return null;
	}

	private void validateOptionalParameters(LinkParameter optionalParameter) {
		// TODO: implement
	}

	private boolean isEmptyString(LinkParameter parameter, Object parameterValue) {
		return parameter.getType() == LinkParameterType.STRING
				&& parameterValue instanceof String
				&& StringUtils.isEmpty((String) parameterValue);
	}

	private String ensureAbsoluteUrl(String href, String server, String servicePath) {
		if (StringUtils.isEmpty(href)
				|| href.startsWith(IHttpClient.HTTP)) {
			return href;
		}

		if (StringUtils.isEmpty(servicePath)
				|| href.startsWith(servicePath)) {
			return StringUtils.prependIfNonEmpty(server, href);
		}

		if (!href.startsWith(servicePath)) {
			href = UrlUtils.appendPath(servicePath, href);
		}
		return StringUtils.prependIfNonEmpty(server, href);
	}

	private String addParameters(String url, Parameter... urlParameters) {
		if (urlParameters == null
				|| urlParameters.length == 0) {
			return url;
		}
		return addParameters(url, Arrays.asList(urlParameters));
	}

	private String addParameters(String url, List urlParameters) {
		if (urlParameters == null
				|| urlParameters.size() == 0) {
			return url;
		}
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			out.write(url.getBytes());
			out.write(IHttpClient.QUESTION_MARK);
			new FormUrlEncodedMediaType().writeTo(new ParameterValueMap(urlParameters), out);
			return out.toString();
		} catch (IOException e) {
			throw new OpenShiftException(e, "Could not add paramters {0} to url {1}", urlParameters, url);
		} catch (EncodingException e) {
			throw new OpenShiftException(e, "Could not add paramters {0} to url {1}", urlParameters, url);
		}
	}

	/**
	 * Replaces variables within the url in the form (":var"):
	 * 
	 * 
	 * 
	 * https://openshift.redhat.com/broker/rest/domain/:domain_name/application/:name
	 * 
	 * 
* * @param href the href (link) that contains the variables that shall get substituted * @param urlPathParameters the list of parameters that shall contain the substitution values * @return */ private String substituteUrlPathParameters(String href, List urlPathParameters) { if (urlPathParameters == null || urlPathParameters.size() == 0) { return href; } return substituteVariables(href, urlPathParameters); } private String substituteVariables(String url, List parameters) { if (StringUtils.isEmpty(url)) { return url; } StringBuffer buffer = new StringBuffer(); Map parameterByName = toMap(parameters); Matcher matcher = PATH_VAR_PATTERN.matcher(url); while (matcher.find()) { String name = matcher.group(1); if (!StringUtils.isEmpty(name)) { Parameter parameter = parameterByName.get(name); if (parameter != null) { matcher.appendReplacement(buffer, String.valueOf(parameter.getValue().getValue())); } } } matcher.appendTail(buffer); return buffer.toString(); } private Map toMap(List parameters) { HashMap parameterByName = new HashMap(); for (Parameter parameter : parameters) { parameterByName.put(parameter.getName(), parameter); } return parameterByName; } public String toString() { return "Link [" + "rel=" + rel + ", " + "httpMethod=" + httpMethod + ", " + "href=" + href + "]"; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy