From 36f09f35002a6e01e3529ce3d4b41fb01e6eb41d Mon Sep 17 00:00:00 2001 From: Jean-Christophe Counio Date: Thu, 14 May 2015 10:35:13 -0700 Subject: [PATCH] JERSEY-2863 Get values from uriInfo instead of having to declare them in bindings --- .../jersey/linking/ELLinkBuilder.java | 29 ++++++++++------- .../jersey/linking/FieldProcessorTest.java | 32 ++++++++++++++++--- .../jersey/linking/HeaderProcessorTest.java | 9 +++--- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ELLinkBuilder.java b/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ELLinkBuilder.java index 20fbe593ec..18614057d1 100644 --- a/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ELLinkBuilder.java +++ b/incubator/declarative-linking/src/main/java/org/glassfish/jersey/linking/ELLinkBuilder.java @@ -108,7 +108,7 @@ static URI buildURI(InjectLinkDescriptor link, UriBuilder ub = applyLinkStyle(template, link.getLinkStyle(), uriInfo); UriTemplateParser parser = new UriTemplateParser(template); List parameterNames = parser.getNames(); - Map valueMap = getParameterValues(parameterNames, link, context); + Map valueMap = getParameterValues(parameterNames, link, context, uriInfo); return ub.buildFromMap(valueMap); } @@ -131,24 +131,29 @@ private static UriBuilder applyLinkStyle(String template, InjectLink.Style style private static Map getParameterValues(List parameterNames, InjectLinkDescriptor linkField, - LinkELContext context) { + LinkELContext context, + UriInfo uriInfo) { Map values = new HashMap<>(); for (String name : parameterNames) { - String elExpression = getEL(name, linkField); + String elExpression = linkField.getBinding(name); + if (elExpression == null) { + String value = uriInfo.getPathParameters().getFirst(name); + if (value == null) { + value = uriInfo.getQueryParameters().getFirst(name); + } + if (value != null) { + values.put(name, value); + continue; + } + elExpression = "${" + ResponseContextResolver.INSTANCE_OBJECT + "." + name + "}"; + } ValueExpression expr = expressionFactory.createValueExpression(context, - elExpression, String.class); + elExpression, String.class); Object value = expr.getValue(context); values.put(name, value != null ? value.toString() : null); - } + } return values; } - private static String getEL(String name, InjectLinkDescriptor linkField) { - String binding = linkField.getBinding(name); - if (binding != null) { - return binding; - } - return "${" + ResponseContextResolver.INSTANCE_OBJECT + "." + name + "}"; - } } diff --git a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java index ccc5c24ede..846a4f89d9 100644 --- a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java +++ b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/FieldProcessorTest.java @@ -61,6 +61,7 @@ import javax.xml.bind.annotation.XmlTransient; +import org.glassfish.jersey.internal.util.collection.MultivaluedStringMap; import org.glassfish.jersey.linking.mapping.ResourceMappingContext; import org.glassfish.jersey.server.ExtendedUriInfo; import org.glassfish.jersey.server.model.Resource; @@ -84,6 +85,8 @@ public class FieldProcessorTest { private static final String baseURI = "http://example.com/application/resources"; + private MultivaluedMap queryParams = new MultivaluedStringMap(); + @Override public String getPath() { throw new UnsupportedOperationException("Not supported yet."); @@ -136,22 +139,22 @@ public UriBuilder getBaseUriBuilder() { @Override public MultivaluedMap getPathParameters() { - throw new UnsupportedOperationException("Not supported yet."); + return new MultivaluedStringMap(); } @Override public MultivaluedMap getPathParameters(boolean decode) { - throw new UnsupportedOperationException("Not supported yet."); + return new MultivaluedStringMap(); } @Override public MultivaluedMap getQueryParameters() { - throw new UnsupportedOperationException("Not supported yet."); + return queryParams; } @Override public MultivaluedMap getQueryParameters(boolean decode) { - throw new UnsupportedOperationException("Not supported yet."); + return queryParams; } @Override @@ -646,6 +649,13 @@ public String getQueryParam2() { public String uri; } + public static class QueryResourceBeanNoBindings { + //query parameters will be populated from uriInfo + //JERSEY-2863 + @InjectLink(resource = QueryResource.class, method = "getB") + public String uri; + } + @Test public void testQueryResource() { LOG.info("QueryResource"); @@ -664,6 +674,20 @@ public void testDoubleQueryResource() { assertEquals("/application/resources/a/b?query=queryExample&query2=queryExample2", testClass.uri); } + @Test + public void testQueryResourceWithoutBindings() { + LOG.info("QueryResource"); + FieldProcessor instance = new FieldProcessor(QueryResourceBeanNoBindings.class); + QueryResourceBeanNoBindings testClass = new QueryResourceBeanNoBindings(); + mockUriInfo.getQueryParameters().putSingle("query", "queryExample"); + mockUriInfo.getQueryParameters().putSingle("query2", "queryExample2"); + assertEquals("queryExample", mockUriInfo.getQueryParameters().getFirst("query")); + instance.processLinks(testClass, mockUriInfo, mockRmc); + assertEquals("/application/resources/a/b?query=queryExample&query2=queryExample2", testClass.uri); + //clean mock + mockUriInfo.getQueryParameters().clear(); + } + public static class TestClassK { public static final ZipEntry zipEntry = new ZipEntry("entry"); diff --git a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java index e117b17781..2021ebedb1 100644 --- a/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java +++ b/incubator/declarative-linking/src/test/java/org/glassfish/jersey/linking/HeaderProcessorTest.java @@ -49,6 +49,7 @@ import javax.ws.rs.core.PathSegment; import javax.ws.rs.core.UriBuilder; +import org.glassfish.jersey.internal.util.collection.MultivaluedStringMap; import org.glassfish.jersey.linking.InjectLink.Extension; import org.glassfish.jersey.linking.mapping.ResourceMappingContext; import org.glassfish.jersey.server.ExtendedUriInfo; @@ -114,19 +115,19 @@ public UriBuilder getBaseUriBuilder() { } public MultivaluedMap getPathParameters() { - throw new UnsupportedOperationException("Not supported yet."); + return new MultivaluedStringMap(); } public MultivaluedMap getPathParameters(boolean decode) { - throw new UnsupportedOperationException("Not supported yet."); + return new MultivaluedStringMap(); } public MultivaluedMap getQueryParameters() { - throw new UnsupportedOperationException("Not supported yet."); + return new MultivaluedStringMap(); } public MultivaluedMap getQueryParameters(boolean decode) { - throw new UnsupportedOperationException("Not supported yet."); + return new MultivaluedStringMap(); } public List getMatchedURIs() {