@VisibleForTesting @SuppressWarnings({ "rawtypes", "unchecked" }) public Function<HttpResponse, ?> getTransformerForMethod(Invocation invocation, Injector injector) { Invokable<?, ?> invoked = invocation.getInvokable(); Function<HttpResponse, ?> transformer; if (invoked.isAnnotationPresent(SelectJson.class)) { Type returnVal = getReturnTypeFor(invoked.getReturnType()); if (invoked.isAnnotationPresent(OnlyElement.class)) returnVal = newParameterizedType(Set.class, returnVal); transformer = new ParseFirstJsonValueNamed(injector.getInstance(GsonWrapper.class), TypeLiteral.get(returnVal), invoked.getAnnotation(SelectJson.class).value()); if (invoked.isAnnotationPresent(OnlyElement.class)) transformer = compose(new OnlyElementOrNull(), transformer); } else { transformer = injector.getInstance(getParserOrThrowException(invocation)); } return transformer; }
@SuppressWarnings("unchecked") @VisibleForTesting Key<? extends Function<HttpResponse, ?>> getParserOrThrowException(Invocation invocation) { Invokable<?, ?> invoked = invocation.getInvokable(); Set<String> acceptHeaders = getAcceptHeaders.apply(invocation); ResponseParser annotation = invoked.getAnnotation(ResponseParser.class); Class<?> rawReturnType = invoked.getReturnType().getRawType(); if (annotation == null) { if (rawReturnType.equals(void.class)) { return Key.get(ReleasePayloadAndReturn.class); } else if (rawReturnType.equals(boolean.class) || rawReturnType.equals(Boolean.class)) { return Key.get(ReturnTrueIf2xx.class); } else if (rawReturnType.equals(InputStream.class)) { return Key.get(ReturnInputStream.class); } else if (rawReturnType.equals(HttpResponse.class)) { return Key.get(Class.class.cast(IdentityFunction.class)); } else if (acceptHeaders.contains(APPLICATION_JSON)) { return getJsonParserKeyForMethod(invoked); } else if (acceptHeaders.contains(APPLICATION_XML) || invoked.isAnnotationPresent(JAXBResponseParser.class)) { return getJAXBParserKeyForMethod(invoked); } else if (rawReturnType.equals(String.class)) { return Key.get(ReturnStringIf2xx.class); } else if (rawReturnType.equals(URI.class)) { return Key.get(ParseURIFromListOrLocationHeaderIf20x.class); } else { throw new IllegalStateException("You must specify a ResponseParser annotation on: " + invoked.toString()); } } return Key.get(annotation.value()); }
protected void assertResponseParserClassEquals(Invokable<?, ?> method, GeneratedHttpRequest request, @Nullable Class<?> parserClass) { assertEquals(injector.getInstance(TransformerForRequest.class).apply(request).getClass(), parserClass); } }
@SuppressWarnings("unchecked") @Override public Function<HttpResponse, ?> apply(HttpRequest in) { GeneratedHttpRequest request = GeneratedHttpRequest.class.cast(in); Function<HttpResponse, ?> transformer; Class<? extends HandlerWithResult<?>> handler = getSaxResponseParserClassOrNull(request.getInvocation() .getInvokable()); if (handler != null) { transformer = parserFactory.create(injector.getInstance(handler)); } else { transformer = getTransformerForMethod(request.getInvocation(), injector); } if (transformer instanceof InvocationContext<?>) { InvocationContext.class.cast(transformer).setContext(request); } if (request.getInvocation().getInvokable().isAnnotationPresent(Transform.class)) { Function<?, ?> wrappingTransformer = injector.getInstance(request.getInvocation().getInvokable() .getAnnotation(Transform.class).value()); if (wrappingTransformer instanceof InvocationContext<?>) { ((InvocationContext<?>) wrappingTransformer).setContext(request); } transformer = compose(Function.class.cast(wrappingTransformer), transformer); } return transformer; }
@SuppressWarnings("unchecked") private static Key<? extends Function<HttpResponse, ?>> getJAXBParserKeyForMethod(Invokable<?, ?> invoked) { Optional<Type> configuredReturnVal = Optional.absent(); if (invoked.isAnnotationPresent(JAXBResponseParser.class)) { Type configuredClass = invoked.getAnnotation(JAXBResponseParser.class).value(); configuredReturnVal = configuredClass.equals(NullType.class) ? Optional.<Type> absent() : Optional .<Type> of(configuredClass); } Type returnVal = configuredReturnVal.or(getReturnTypeFor(invoked.getReturnType())); Type parserType = newParameterizedType(ParseXMLWithJAXB.class, returnVal); return (Key<? extends Function<HttpResponse, ?>>) Key.get(parserType); }
@SuppressWarnings("unchecked") protected Function<HttpResponse, T> parser(Injector i) { try { return (Function<HttpResponse, T>) i .createChildInjector(new SaxParserModule()) .getInstance(TransformerForRequest.class) .getTransformerForMethod(Invocation.create(method(getClass(), "expected"), ImmutableList.of()), i); } catch (Exception e) { throw Throwables.propagate(e); } }
@SuppressWarnings("unchecked") public <T> Class<? extends Function<HttpResponse, ?>> unwrap(Class<T> type, Invokable<?, ?> method) { return (Class<? extends Function<HttpResponse, ?>>) transformer .getParserOrThrowException(Invocation.create(method, ImmutableList.of())).getTypeLiteral().getRawType(); }
@SuppressWarnings("unchecked") @Override public Function<HttpResponse, ?> apply(HttpRequest in) { GeneratedHttpRequest request = GeneratedHttpRequest.class.cast(in); Function<HttpResponse, ?> transformer; Class<? extends HandlerWithResult<?>> handler = getSaxResponseParserClassOrNull(request.getInvocation() .getInvokable()); if (handler != null) { transformer = parserFactory.create(injector.getInstance(handler)); } else { transformer = getTransformerForMethod(request.getInvocation(), injector); } if (transformer instanceof InvocationContext<?>) { InvocationContext.class.cast(transformer).setContext(request); } if (request.getInvocation().getInvokable().isAnnotationPresent(Transform.class)) { Function<?, ?> wrappingTransformer = injector.getInstance(request.getInvocation().getInvokable() .getAnnotation(Transform.class).value()); if (wrappingTransformer instanceof InvocationContext<?>) { ((InvocationContext<?>) wrappingTransformer).setContext(request); } transformer = compose(Function.class.cast(wrappingTransformer), transformer); } return transformer; }
@SuppressWarnings("unchecked") private static Key<? extends Function<HttpResponse, ?>> getJAXBParserKeyForMethod(Invokable<?, ?> invoked) { Optional<Type> configuredReturnVal = Optional.absent(); if (invoked.isAnnotationPresent(JAXBResponseParser.class)) { Type configuredClass = invoked.getAnnotation(JAXBResponseParser.class).value(); configuredReturnVal = configuredClass.equals(NullType.class) ? Optional.<Type> absent() : Optional .<Type> of(configuredClass); } Type returnVal = configuredReturnVal.or(getReturnTypeFor(invoked.getReturnType())); Type parserType = newParameterizedType(ParseXMLWithJAXB.class, returnVal); return (Key<? extends Function<HttpResponse, ?>>) Key.get(parserType); }
@SuppressWarnings("unchecked") protected Function<HttpResponse, T> parser(Injector i) { try { return (Function<HttpResponse, T>) i .createChildInjector(new SaxParserModule()) .getInstance(TransformerForRequest.class) .getTransformerForMethod(Invocation.create(method(getClass(), "expected"), ImmutableList.of()), i); } catch (Exception e) { throw Throwables.propagate(e); } }
@SuppressWarnings("unchecked") public Class<?> unwrap(Invokable<?, ?> method) { return transformer.getParserOrThrowException(Invocation.create(method, ImmutableList.of())).getTypeLiteral() .getRawType(); }
@VisibleForTesting @SuppressWarnings({ "rawtypes", "unchecked" }) public Function<HttpResponse, ?> getTransformerForMethod(Invocation invocation, Injector injector) { Invokable<?, ?> invoked = invocation.getInvokable(); Function<HttpResponse, ?> transformer; if (invoked.isAnnotationPresent(SelectJson.class)) { Type returnVal = getReturnTypeFor(invoked.getReturnType()); if (invoked.isAnnotationPresent(OnlyElement.class)) returnVal = newParameterizedType(Set.class, returnVal); transformer = new ParseFirstJsonValueNamed(injector.getInstance(GsonWrapper.class), TypeLiteral.get(returnVal), invoked.getAnnotation(SelectJson.class).value()); if (invoked.isAnnotationPresent(OnlyElement.class)) transformer = compose(new OnlyElementOrNull(), transformer); } else { transformer = injector.getInstance(getParserOrThrowException(invocation)); } return transformer; }
@SuppressWarnings("unchecked") @Override public Function<HttpResponse, ?> apply(HttpRequest in) { GeneratedHttpRequest request = GeneratedHttpRequest.class.cast(in); Function<HttpResponse, ?> transformer; Class<? extends HandlerWithResult<?>> handler = getSaxResponseParserClassOrNull(request.getInvocation() .getInvokable()); if (handler != null) { transformer = parserFactory.create(injector.getInstance(handler)); } else { transformer = getTransformerForMethod(request.getInvocation(), injector); } if (transformer instanceof InvocationContext<?>) { InvocationContext.class.cast(transformer).setContext(request); } if (request.getInvocation().getInvokable().isAnnotationPresent(Transform.class)) { Function<?, ?> wrappingTransformer = injector.getInstance(request.getInvocation().getInvokable() .getAnnotation(Transform.class).value()); if (wrappingTransformer instanceof InvocationContext<?>) { ((InvocationContext<?>) wrappingTransformer).setContext(request); } transformer = compose(Function.class.cast(wrappingTransformer), transformer); } return transformer; }
@SuppressWarnings("unchecked") @VisibleForTesting Key<? extends Function<HttpResponse, ?>> getParserOrThrowException(Invocation invocation) { Invokable<?, ?> invoked = invocation.getInvokable(); Set<String> acceptHeaders = getAcceptHeaders.apply(invocation); ResponseParser annotation = invoked.getAnnotation(ResponseParser.class); Class<?> rawReturnType = invoked.getReturnType().getRawType(); if (annotation == null) { if (rawReturnType.equals(void.class)) { return Key.get(ReleasePayloadAndReturn.class); } else if (rawReturnType.equals(boolean.class) || rawReturnType.equals(Boolean.class)) { return Key.get(ReturnTrueIf2xx.class); } else if (rawReturnType.equals(InputStream.class)) { return Key.get(ReturnInputStream.class); } else if (rawReturnType.equals(HttpResponse.class)) { return Key.get(Class.class.cast(IdentityFunction.class)); } else if (acceptHeaders.contains(APPLICATION_JSON)) { return getJsonParserKeyForMethod(invoked); } else if (acceptHeaders.contains(APPLICATION_XML) || invoked.isAnnotationPresent(JAXBResponseParser.class)) { return getJAXBParserKeyForMethod(invoked); } else if (rawReturnType.equals(String.class)) { return Key.get(ReturnStringIf2xx.class); } else if (rawReturnType.equals(URI.class)) { return Key.get(ParseURIFromListOrLocationHeaderIf20x.class); } else { throw new IllegalStateException("You must specify a ResponseParser annotation on: " + invoked.toString()); } } return Key.get(annotation.value()); }
@SuppressWarnings("unchecked") private static Key<? extends Function<HttpResponse, ?>> getJAXBParserKeyForMethod(Invokable<?, ?> invoked) { Optional<Type> configuredReturnVal = Optional.absent(); if (invoked.isAnnotationPresent(JAXBResponseParser.class)) { Type configuredClass = invoked.getAnnotation(JAXBResponseParser.class).value(); configuredReturnVal = configuredClass.equals(NullType.class) ? Optional.<Type> absent() : Optional .<Type> of(configuredClass); } Type returnVal = configuredReturnVal.or(getReturnTypeFor(invoked.getReturnType())); Type parserType = newParameterizedType(ParseXMLWithJAXB.class, returnVal); return (Key<? extends Function<HttpResponse, ?>>) Key.get(parserType); }
protected void assertResponseParserClassEquals(Invokable<?, ?> method, GeneratedHttpRequest request, @Nullable Class<?> parserClass) { assertEquals(injector.getInstance(TransformerForRequest.class).apply(request).getClass(), parserClass); } }
@VisibleForTesting @SuppressWarnings({ "rawtypes", "unchecked" }) public Function<HttpResponse, ?> getTransformerForMethod(Invocation invocation, Injector injector) { Invokable<?, ?> invoked = invocation.getInvokable(); Function<HttpResponse, ?> transformer; if (invoked.isAnnotationPresent(SelectJson.class)) { Type returnVal = getReturnTypeFor(invoked.getReturnType()); if (invoked.isAnnotationPresent(OnlyElement.class)) returnVal = newParameterizedType(Set.class, returnVal); transformer = new ParseFirstJsonValueNamed(injector.getInstance(GsonWrapper.class), TypeLiteral.get(returnVal), invoked.getAnnotation(SelectJson.class).value()); if (invoked.isAnnotationPresent(OnlyElement.class)) transformer = compose(new OnlyElementOrNull(), transformer); } else { transformer = injector.getInstance(getParserOrThrowException(invocation)); } return transformer; }
@SuppressWarnings("unchecked") @Override public Function<HttpResponse, ?> apply(HttpRequest in) { GeneratedHttpRequest request = GeneratedHttpRequest.class.cast(in); Function<HttpResponse, ?> transformer; Class<? extends HandlerWithResult<?>> handler = getSaxResponseParserClassOrNull(request.getInvocation() .getInvokable()); if (handler != null) { transformer = parserFactory.create(injector.getInstance(handler)); } else { transformer = getTransformerForMethod(request.getInvocation(), injector); } if (transformer instanceof InvocationContext<?>) { InvocationContext.class.cast(transformer).setContext(request); } if (request.getInvocation().getInvokable().isAnnotationPresent(Transform.class)) { Function<?, ?> wrappingTransformer = injector.getInstance(request.getInvocation().getInvokable() .getAnnotation(Transform.class).value()); if (wrappingTransformer instanceof InvocationContext<?>) { ((InvocationContext<?>) wrappingTransformer).setContext(request); } transformer = compose(Function.class.cast(wrappingTransformer), transformer); } return transformer; }
@SuppressWarnings("unchecked") @VisibleForTesting Key<? extends Function<HttpResponse, ?>> getParserOrThrowException(Invocation invocation) { Invokable<?, ?> invoked = invocation.getInvokable(); Set<String> acceptHeaders = getAcceptHeaders.apply(invocation); ResponseParser annotation = invoked.getAnnotation(ResponseParser.class); Class<?> rawReturnType = invoked.getReturnType().getRawType(); if (annotation == null) { if (rawReturnType.equals(void.class)) { return Key.get(ReleasePayloadAndReturn.class); } else if (rawReturnType.equals(boolean.class) || rawReturnType.equals(Boolean.class)) { return Key.get(ReturnTrueIf2xx.class); } else if (rawReturnType.equals(InputStream.class)) { return Key.get(ReturnInputStream.class); } else if (rawReturnType.equals(HttpResponse.class)) { return Key.get(Class.class.cast(IdentityFunction.class)); } else if (acceptHeaders.contains(APPLICATION_JSON)) { return getJsonParserKeyForMethod(invoked); } else if (acceptHeaders.contains(APPLICATION_XML) || invoked.isAnnotationPresent(JAXBResponseParser.class)) { return getJAXBParserKeyForMethod(invoked); } else if (rawReturnType.equals(String.class)) { return Key.get(ReturnStringIf2xx.class); } else if (rawReturnType.equals(URI.class)) { return Key.get(ParseURIFromListOrLocationHeaderIf20x.class); } else { throw new IllegalStateException("You must specify a ResponseParser annotation on: " + invoked.toString()); } } return Key.get(annotation.value()); }
@SuppressWarnings({ "unchecked" }) private static Key<? extends Function<HttpResponse, ?>> getJsonParserKeyForMethod(Invokable<?, ?> invoked) { ParameterizedType parserType; if (invoked.isAnnotationPresent(Unwrap.class)) { parserType = newParameterizedType(UnwrapOnlyJsonValue.class, getReturnTypeFor(invoked.getReturnType())); } else { parserType = newParameterizedType(ParseJson.class, getReturnTypeFor(invoked.getReturnType())); } return (Key<? extends Function<HttpResponse, ?>>) Key.get(parserType); }