/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Formatter;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ws.rs.Path;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriBuilderException;
import com.opengamma.util.ArgumentChecker;
/**
* MockUriBuilder intended for testing in memory web resources
*/
public class MockUriBuilder extends UriBuilder {
private static final Pattern s_pathPattern = Pattern.compile("\\{\\w+\\}");
private String _pathFormat = "";
@Override
public UriBuilder clone() {
return this;
}
@Override
public UriBuilder uri(URI uri) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder scheme(String scheme) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder schemeSpecificPart(String ssp) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder userInfo(String ui) {
return this;
}
@Override
public UriBuilder host(String host) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder port(int port) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder replacePath(String path) {
return this;
}
@Override
public UriBuilder path(String path) throws IllegalArgumentException {
ArgumentChecker.notNull(path, "path");
formathPath(path);
return this;
}
@SuppressWarnings("rawtypes")
@Override
public UriBuilder path(Class resource) throws IllegalArgumentException {
ArgumentChecker.notNull(resource, "class");
@SuppressWarnings("unchecked")
Annotation annotation = resource.getAnnotation(Path.class);
if (annotation == null) {
throw new IllegalArgumentException();
}
formatPath((Path) annotation);
return this;
}
private void formatPath(Path annotation) {
String path = annotation.value();
formathPath(path);
}
private void formathPath(String path) {
Matcher matcher = s_pathPattern.matcher(path);
int start = 0;
int end = 0;
StringBuilder buf = new StringBuilder();
int count = 0;
while (matcher.find()) {
end = matcher.start();
buf.append(path.substring(start, end)).append("%" + ++count + "$s");
start = matcher.end();
}
buf.append(path.substring(start, path.length()));
if (path.startsWith("/")) {
_pathFormat += buf.toString();
} else {
_pathFormat += "/" + buf.toString();
}
}
@SuppressWarnings("rawtypes")
@Override
public UriBuilder path(Class resource, String methodName) throws IllegalArgumentException {
ArgumentChecker.notNull(resource, "class");
Method[] methods = resource.getMethods();
Method method = null;
for (Method aMethod : methods) {
if (aMethod.getName().equals(methodName)) {
method = aMethod;
break;
}
}
if (method == null) {
throw new IllegalArgumentException("Method " + methodName + " can not be found in class " + resource);
}
path(method);
return this;
}
@Override
public UriBuilder path(Method method) throws IllegalArgumentException {
ArgumentChecker.notNull(method, "method");
Path annotation = method.getAnnotation(Path.class);
if (annotation == null) {
throw new IllegalArgumentException("Path annotation missing in method " + method.getName());
}
formatPath(annotation);
return this;
}
@Override
public UriBuilder segment(String... segments) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder replaceMatrix(String matrix) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder matrixParam(String name, Object... values) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder replaceMatrixParam(String name, Object... values) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder replaceQuery(String query) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder queryParam(String name, Object... values) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder replaceQueryParam(String name, Object... values) throws IllegalArgumentException {
return this;
}
@Override
public UriBuilder fragment(String fragment) {
return this;
}
@Override
public URI buildFromMap(Map<String, ? extends Object> values) throws IllegalArgumentException, UriBuilderException {
return null;
}
@Override
public URI buildFromEncodedMap(Map<String, ? extends Object> values) throws IllegalArgumentException, UriBuilderException {
return null;
}
@Override
public URI build(Object... values) throws IllegalArgumentException, UriBuilderException {
String url = null;
try {
url = new Formatter().format(_pathFormat, values).toString();
} catch (Exception ex) {
throw new UriBuilderException("Problem building url from format[" + _pathFormat + "] and values[" + values + "]", ex);
}
return URI.create(url);
}
@Override
public URI buildFromEncoded(Object... values) throws IllegalArgumentException, UriBuilderException {
return null;
}
}