Skip to content

Commit

Permalink
Merge 66eeb6d into b2edef1
Browse files Browse the repository at this point in the history
  • Loading branch information
ogirardot committed Mar 3, 2015
2 parents b2edef1 + 66eeb6d commit 3a015e6
Show file tree
Hide file tree
Showing 17 changed files with 170 additions and 105 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package fr.vidal.oss.jax_rs_linker.functions;

import com.google.common.base.Function;
import fr.vidal.oss.jax_rs_linker.model.QueryParameter;

import javax.annotation.Nullable;
import javax.lang.model.element.Element;
import javax.lang.model.element.VariableElement;
import javax.ws.rs.QueryParam;

public enum ElementToQueryParameter implements Function<Element, QueryParameter> {

INTO_QUERY_PARAMETER;

@Nullable
@Override
public QueryParameter apply(Element parameterElement) {
return new QueryParameter(parameterElement.getAnnotation(QueryParam.class).value());
}

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,15 @@
public class QueryParameter {

private String name;
private ClassName className;

public QueryParameter(ClassName className, String name) {
public QueryParameter(String name) {
this.name = name;
this.className = className;
}

public String getName() {
return name;
}

public ClassName getClassName() {
return className;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
Expand All @@ -30,19 +24,18 @@ public boolean equals(Object obj) {
return false;
}
final QueryParameter other = (QueryParameter) obj;
return Objects.equal(this.className, other.className) && Objects.equal(this.name, other.name);
return Objects.equal(this.name, other.name);
}

@Override
public int hashCode() {
return Objects.hashCode(className, name);
return Objects.hashCode(name);
}

@Override
public String toString() {
return "QueryParameter { " +
"name='" + name + "\'" +
", className='" + className +
"' }";
return "QueryParameter{" +
"name='" + name + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,24 @@

import javax.annotation.processing.Messager;
import javax.lang.model.element.*;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.ElementFilter;
import javax.lang.model.util.Types;
import javax.ws.rs.BeanParam;
import javax.ws.rs.QueryParam;
import java.util.Collection;
import java.util.List;

import static com.google.common.base.Optional.absent;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Lists.newArrayList;
import static fr.vidal.oss.jax_rs_linker.functions.AnnotationMirrorToMethodValueEntryFunction.TO_METHOD_VALUE_ENTRIES;
import static fr.vidal.oss.jax_rs_linker.functions.EntriesToStringValueFunction.TO_STRING_VALUE;
import static fr.vidal.oss.jax_rs_linker.functions.VariableElementToQueryParameter.INTO_QUERY_PARAMETER;
import static fr.vidal.oss.jax_rs_linker.functions.ElementToQueryParameter.INTO_QUERY_PARAMETER;
import static fr.vidal.oss.jax_rs_linker.predicates.AnnotationMirrorByNamePredicate.byName;
import static fr.vidal.oss.jax_rs_linker.predicates.UnparseableValuePredicate.IS_UNPARSEABLE;

import static javax.tools.Diagnostic.Kind.ERROR;

public class ElementParser {
Expand All @@ -32,11 +36,13 @@ public class ElementParser {
private final PathVisitor pathVisitor;
private final ClassWorkLoad workLoad;
private final HttpVerbVisitor httpVerbVisitor;
private final Types typeUtils;

public ElementParser(Messager messager,
Types typeUtils) {

this.messager = messager;
this.typeUtils = typeUtils;
this.pathVisitor = new PathVisitor(typeUtils);
this.workLoad = ClassWorkLoad.init();
this.httpVerbVisitor = new HttpVerbVisitor();
Expand Down Expand Up @@ -91,21 +97,21 @@ private Optional<ApiLink> link(ExecutableElement methodElement, boolean withSelf

private Optional<SubResourceTarget> relatedResourceName(ExecutableElement methodElement) {
return FluentIterable.from(methodElement.getAnnotationMirrors())
.filter(byName("SubResource"))
.transform(TO_METHOD_VALUE_ENTRIES)
.transform(TO_STRING_VALUE)
.firstMatch(not(IS_UNPARSEABLE));
.filter(byName("SubResource"))
.transform(TO_METHOD_VALUE_ENTRIES)
.transform(TO_STRING_VALUE)
.firstMatch(not(IS_UNPARSEABLE));
}

private Mapping mapping(ExecutableElement methodElement, ApiLink link, HttpVerb httpVerb, String path) {
return new Mapping(
javaLocation(methodElement),
api(
link,
httpVerb,
apiPath(methodElement, path),
apiQuery(methodElement.getParameters())
)
javaLocation(methodElement),
api(
link,
httpVerb,
apiPath(methodElement, path),
apiQuery(methodElement.getParameters())
)
);
}

Expand All @@ -127,23 +133,23 @@ private Optional<CompilationError> trackMandatoryParsing(ApiLink link, Mapping m

private JavaLocation javaLocation(ExecutableElement methodElement) {
return new JavaLocation(
className(methodElement),
methodElement.getSimpleName().toString()
className(methodElement),
methodElement.getSimpleName().toString()
);
}

private Api api(ApiLink link, HttpVerb httpVerb, ApiPath apiPath, ApiQuery apiQuery) {
return new Api(
httpVerb,
link,
apiPath,
apiQuery);
httpVerb,
link,
apiPath,
apiQuery);
}

private ApiPath apiPath(ExecutableElement methodElement, String path) {
return new ApiPath(
path,
pathVisitor.visitPathParameters(methodElement)
path,
pathVisitor.visitPathParameters(methodElement)
);
}

Expand All @@ -154,10 +160,39 @@ private ApiQuery apiQuery(Collection<? extends VariableElement> parameters) {
if (annotation != null) {
queryParameters.add(INTO_QUERY_PARAMETER.apply(variableElement));
}
BeanParam beanParam = variableElement.getAnnotation(BeanParam.class);
if (beanParam != null) {
Element beanParamTargetClass = typeUtils.asElement(variableElement.asType());
List<? extends Element> enclosedElements = beanParamTargetClass.getEnclosedElements();
for (ExecutableElement ctor : ElementFilter.constructorsIn(enclosedElements)) {
for (VariableElement ctorParameter : ctor.getParameters()) {
addToQueryParametersIfApplicable(queryParameters, ctorParameter);
}
}

for (VariableElement field : ElementFilter.fieldsIn(enclosedElements)) {
addToQueryParametersIfApplicable(queryParameters, field);
}

for (ExecutableElement method : ElementFilter.methodsIn(enclosedElements)) {
if (method.getSimpleName().toString().startsWith("set")
&& typeUtils.isSameType(method.getReturnType(),typeUtils.getNoType(TypeKind.VOID))) {
addToQueryParametersIfApplicable(queryParameters, method);
}
}
}
}
return new ApiQuery(queryParameters);
}

private void addToQueryParametersIfApplicable(Collection<QueryParameter> queryParameters,
Element ctorParameter) {
QueryParam queryParam = ctorParameter.getAnnotation(QueryParam.class);
if (queryParam != null) {
queryParameters.add(INTO_QUERY_PARAMETER.apply(ctorParameter));
}
}

private ClassName className(ExecutableElement element) {
TypeElement classElement = (TypeElement) element.getEnclosingElement();
return ClassName.valueOf(classElement.getQualifiedName().toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,12 +158,11 @@ private String pathParametersAsList(Collection<PathParameter> pathParameters) {
private String queryParametersAsList(Collection<QueryParameter> queryParameters) {
StringBuilder builder = new StringBuilder();
Iterator<QueryParameter> iterator = queryParameters.iterator();
while(iterator.hasNext()) {
while (iterator.hasNext()) {
QueryParameter parameter = iterator.next();
String separator = iterator.hasNext() ? "," : "";
builder.append(String.format(
"queryParameter(\"%s\", \"%s\")%s",
parameter.getClassName(),
"queryParameter(\"%s\")%s",
parameter.getName(),
separator
));
Expand Down Expand Up @@ -194,15 +193,11 @@ private MethodSpec queryParameterMethod() {
return MethodSpec.methodBuilder("queryParameter")
.returns(QueryParameter.class)
.addModifiers(PRIVATE, STATIC)
.addParameter(
ParameterSpec.builder(String.class, "type", FINAL).build())
.addParameter(
ParameterSpec.builder(String.class, "name", FINAL).build())
.addStatement(
"return new $T($T.valueOf($L), $L)",
"return new $T($L)",
QueryParameter.class,
ClassName.class,
"type",
"name"
)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ public void generates_graph_of_linkers() {
.and()
.generatesSources(
forResource("ProductResourceLinker.java"),
forResource("PersonResourceLinker.java"),
forResource("BrandResourceLinker.java"),
forResource("ProductResourcePathParameters.java"),
forResource("BrandResourcePathParameters.java"),
forResource("PersonResourcePathParameters.java"),
forResource("PersonResourcePathParameters.java"),
forResource("PersonResourceQueryParameters.java"),
forResource("linkers/Linkers.java")
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void equals_should_return_true_if_object_are_identical() {

@Test
public void toString_should_return_a_valid_string_representation() {
Collection<QueryParameter> queryParameters = newArrayList(new QueryParameter(ClassName.valueOf("fr.vidal.oss.Foo"),"Foo"),new QueryParameter(ClassName.valueOf("fr.vidal.oss.Bar"),"Bar") );
Collection<QueryParameter> queryParameters = newArrayList(new QueryParameter("Foo"),new QueryParameter("Bar") );
ApiQuery apiQuery = new ApiQuery(queryParameters);

assertThat(apiQuery.toString()).isEqualTo("ApiQuery{queryParameters=[FooBar]}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,32 @@ public class QueryParameterTest {

@Test
public void equals_should_return_true_if_objects_are_identical() {
QueryParameter queryParameter = new QueryParameter(ClassName.valueOf("fr.vidal.oss.Foo"),"Foo");
QueryParameter queryParameter = new QueryParameter("Foo");
QueryParameter queryParameter1 = queryParameter;

assertThat(queryParameter).isEqualTo(queryParameter1);
}

@Test
public void equals_should_return_false_if_object_is_null() {
QueryParameter queryParameter = new QueryParameter(ClassName.valueOf("fr.vidal.oss.Foo"),"Foo");
QueryParameter queryParameter = new QueryParameter("Foo");
QueryParameter queryParameter1 = null;

assertThat(queryParameter).isNotEqualTo(queryParameter1);
}

@Test
public void equals_should_return_false_Objects_have_not_the_same_class() {
QueryParameter queryParameter = new QueryParameter(ClassName.valueOf("fr.vidal.oss.Foo"),"Foo");
QueryParameter queryParameter = new QueryParameter("Foo");
String queryParameter1 = "baz";

assertThat(queryParameter).isNotEqualTo(queryParameter1);
}

@Test
public void equals_should_return_false_Objects_are_not_deeply_identical() {
QueryParameter queryParameter = new QueryParameter(ClassName.valueOf("fr.vidal.oss.Foo"),"Foo");
QueryParameter queryParameter1 = new QueryParameter(ClassName.valueOf("fr.vidal.oss.Foo"),"Bar");
QueryParameter queryParameter2 = new QueryParameter(ClassName.valueOf("fr.vidal.oss.FooBaz"),"Foo");

assertThat(queryParameter).isNotEqualTo(queryParameter1);
assertThat(queryParameter).isNotEqualTo(queryParameter2);
}

@Test
public void toString_should_return_a_valid_string() {
QueryParameter queryParameter = new QueryParameter(ClassName.valueOf("fr.vidal.oss.Foo"),"Foo");
QueryParameter queryParameter = new QueryParameter("Foo");

assertThat(queryParameter.toString()).isEqualTo("QueryParameter { name='Foo', className='fr.vidal.oss.Foo' }");
assertThat(queryParameter.toString()).isEqualTo("QueryParameter{name='Foo'}");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,36 @@ public void parses_method_to_mapping_representation() {
.containsExactly(new PathParameter(ClassName.valueOf("int"), "id"));
}

@Test
public void parses_method_to_mapping_representation_with_bean_param() {
ExecutableElement method = methodElements.of(
"fr.vidal.oss.jax_rs_linker.parser.ProductResource",
"productById"
);

Mapping mapping = parser.parse(method).get();

JavaLocation javaLocation = mapping.getJavaLocation();
assertThat(javaLocation.getClassName().fullyQualifiedName())
.isEqualTo("fr.vidal.oss.jax_rs_linker.parser.ProductResource");
assertThat(javaLocation.getMethodName())
.isEqualTo("productById");

Api api = mapping.getApi();
assertThat(api.getApiPath().getPath())
.isEqualTo("/api/product/{id}");
assertThat(api.getApiPath().getPathParameters())
.containsExactly(new PathParameter(ClassName.valueOf("int"), "id"));
assertThat(api.getApiQuery().getQueryParameters())
.hasSize(4)
.containsExactly(
new QueryParameter("start-page"),
new QueryParameter("page-size"),
new QueryParameter("is-applicable"),
new QueryParameter("haters-gonna-hate")
);
}

@Test
public void fails_to_parse_because_of_absence_of_path() {
ExecutableElement method = methodElements.of(
Expand Down

0 comments on commit 3a015e6

Please sign in to comment.