Repository: aries-jax-rs-whiteboard Updated Branches: refs/heads/master 496200f0e -> c62794dfa
Improve the scalability of the PromiseRxInvokerImpl by using native CXF API Project: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/repo Commit: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/commit/c62794df Tree: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/tree/c62794df Diff: http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/diff/c62794df Branch: refs/heads/master Commit: c62794dfaf5fab8e95e03815c6176bdcf9fa763e Parents: 496200f Author: Tim Ward <[email protected]> Authored: Thu Feb 1 09:42:29 2018 +0000 Committer: Tim Ward <[email protected]> Committed: Thu Feb 1 09:42:29 2018 +0000 ---------------------------------------------------------------------- .../internal/client/ClientBuilderFactory.java | 1 + .../internal/client/PromiseRxInvokerImpl.java | 172 --------------- .../client/PromiseRxInvokerProviderImpl.java | 52 ----- .../cxf/jaxrs/client/PromiseRxInvokerImpl.java | 207 +++++++++++++++++++ .../client/PromiseRxInvokerProviderImpl.java | 54 +++++ 5 files changed, 262 insertions(+), 224 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/c62794df/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java ---------------------------------------------------------------------- diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java index d98dc24..90ccb62 100644 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java +++ b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/ClientBuilderFactory.java @@ -19,6 +19,7 @@ package org.apache.aries.jax.rs.whiteboard.internal.client; import javax.ws.rs.client.ClientBuilder; +import org.apache.cxf.jaxrs.client.PromiseRxInvokerProviderImpl; import org.apache.cxf.jaxrs.client.spec.ClientBuilderImpl; import org.osgi.framework.Bundle; import org.osgi.framework.PrototypeServiceFactory; http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/c62794df/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java ---------------------------------------------------------------------- diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java deleted file mode 100644 index b1ab900..0000000 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerImpl.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.aries.jax.rs.whiteboard.internal.client; - -import org.osgi.service.jaxrs.client.PromiseRxInvoker; -import org.osgi.util.promise.Promise; -import org.osgi.util.promise.PromiseFactory; - -import javax.ws.rs.HttpMethod; -import javax.ws.rs.client.Entity; -import javax.ws.rs.client.SyncInvoker; -import javax.ws.rs.core.GenericType; -import javax.ws.rs.core.Response; - -class PromiseRxInvokerImpl implements PromiseRxInvoker { - - public PromiseRxInvokerImpl( - SyncInvoker syncInvoker, PromiseFactory promiseFactory) { - - _syncInvoker = syncInvoker; - _promiseFactory = promiseFactory; - } - - @Override - public Promise<Response> delete() { - return method(HttpMethod.DELETE); - } - - @Override - public <R> Promise<R> delete(Class<R> aClass) { - return method(HttpMethod.DELETE, aClass); - } - - @Override - public <R> Promise<R> delete(GenericType<R> genericType) { - return method(HttpMethod.DELETE, genericType); - } - - @Override - public Promise<Response> get() { - return method(HttpMethod.GET); - } - - @Override - public <R> Promise<R> get(Class<R> aClass) { - return method(HttpMethod.GET, aClass); - } - - @Override - public <R> Promise<R> get(GenericType<R> genericType) { - return method(HttpMethod.GET, genericType); - } - - @Override - public Promise<Response> head() { - return method(HttpMethod.HEAD); - } - - @Override - public <R> Promise<R> method(String s, Class<R> aClass) { - return _promiseFactory.submit(() -> _syncInvoker.method(s, aClass)); - } - - @Override - public <R> Promise<R> method(String s, Entity<?> entity, Class<R> aClass) { - return _promiseFactory.submit( - () -> _syncInvoker.method(s, entity, aClass)); - } - - @Override - public <R> Promise<R> method( - String s, Entity<?> entity, GenericType<R> genericType) { - - return _promiseFactory.submit( - () -> _syncInvoker.method(s, entity, genericType)); - } - - @Override - public Promise<Response> method(String s, Entity<?> entity) { - return _promiseFactory.submit(() -> _syncInvoker.method(s, entity)); - } - - @Override - public <R> Promise<R> method(String s, GenericType<R> genericType) { - return _promiseFactory.submit( - () -> _syncInvoker.method(s, genericType)); - } - - @Override - public Promise<Response> method(String s) { - return _promiseFactory.submit(() -> _syncInvoker.method(s)); - } - - @Override - public Promise<Response> options() { - return method(HttpMethod.OPTIONS); - } - - @Override - public <R> Promise<R> options(Class<R> aClass) { - return method(HttpMethod.OPTIONS, aClass); - } - - @Override - public <R> Promise<R> options(GenericType<R> genericType) { - return method(HttpMethod.OPTIONS, genericType); - } - - @Override - public <R> Promise<R> post(Entity<?> entity, Class<R> aClass) { - return method(HttpMethod.POST, entity, aClass); - } - - @Override - public <R> Promise<R> post(Entity<?> entity, GenericType<R> genericType) { - return method(HttpMethod.POST, entity, genericType); - } - - @Override - public Promise<Response> post(Entity<?> entity) { - return method(HttpMethod.POST, entity); - } - - @Override - public <R> Promise<R> put(Entity<?> entity, Class<R> aClass) { - return method(HttpMethod.PUT, entity, aClass); - } - - @Override - public <R> Promise<R> put(Entity<?> entity, GenericType<R> genericType) { - return method(HttpMethod.PUT, entity, genericType); - } - - @Override - public Promise<Response> put(Entity<?> entity) { - return method(HttpMethod.PUT, entity); - } - - @Override - public Promise<Response> trace() { - return method("TRACE", Response.class); - } - - @Override - public <R> Promise<R> trace(Class<R> aClass) { - return method("TRACE", aClass); - } - - @Override - public <R> Promise<R> trace(GenericType<R> genericType) { - return method("TRACE", genericType); - } - - private final PromiseFactory _promiseFactory; - private final SyncInvoker _syncInvoker; - -} http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/c62794df/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java ---------------------------------------------------------------------- diff --git a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java b/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java deleted file mode 100644 index c8b36d1..0000000 --- a/jax-rs.whiteboard/src/main/java/org/apache/aries/jax/rs/whiteboard/internal/client/PromiseRxInvokerProviderImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.aries.jax.rs.whiteboard.internal.client; - -import org.osgi.service.jaxrs.client.PromiseRxInvoker; -import org.osgi.util.promise.PromiseFactory; - -import javax.ws.rs.client.RxInvokerProvider; -import javax.ws.rs.client.SyncInvoker; -import java.util.concurrent.ExecutorService; - -public class PromiseRxInvokerProviderImpl - implements RxInvokerProvider<PromiseRxInvoker> { - - @Override - public boolean isProviderFor(Class<?> clazz) { - return clazz == PromiseRxInvoker.class; - } - - @Override - public PromiseRxInvoker getRxInvoker( - SyncInvoker syncInvoker, ExecutorService executorService) { - - PromiseFactory promiseFactory; - - if (executorService != null) { - promiseFactory = new PromiseFactory(executorService); - } - else { - promiseFactory = new PromiseFactory( - PromiseFactory.inlineExecutor()); - } - - return new PromiseRxInvokerImpl(syncInvoker, promiseFactory); - } - -} http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/c62794df/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerImpl.java ---------------------------------------------------------------------- diff --git a/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerImpl.java b/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerImpl.java new file mode 100644 index 0000000..9b83261 --- /dev/null +++ b/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerImpl.java @@ -0,0 +1,207 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cxf.jaxrs.client; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.InvocationCallback; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.Response; + +import org.osgi.service.jaxrs.client.PromiseRxInvoker; +import org.osgi.util.promise.Deferred; +import org.osgi.util.promise.Promise; +import org.osgi.util.promise.PromiseFactory; + +class PromiseRxInvokerImpl implements PromiseRxInvoker { + + private static final class DeferredHandler<R> implements InvocationCallback<R> { + private final Deferred<R> deferred; + + private DeferredHandler(Deferred<R> deferred) { + this.deferred = deferred; + } + + @Override + public void completed(R response) { + deferred.resolve(response); + } + + @Override + public void failed(Throwable throwable) { + deferred.fail(throwable); + } + } + public PromiseRxInvokerImpl( + WebClient webClient, PromiseFactory promiseFactory) { + _webClient = webClient; + _promiseFactory = promiseFactory; + } + + @Override + public Promise<Response> delete() { + return method(HttpMethod.DELETE); + } + + @Override + public <R> Promise<R> delete(Class<R> aClass) { + return method(HttpMethod.DELETE, aClass); + } + + @Override + public <R> Promise<R> delete(GenericType<R> genericType) { + return method(HttpMethod.DELETE, genericType); + } + + @Override + public Promise<Response> get() { + return method(HttpMethod.GET); + } + + @Override + public <R> Promise<R> get(Class<R> aClass) { + return method(HttpMethod.GET, aClass); + } + + @Override + public <R> Promise<R> get(GenericType<R> genericType) { + return method(HttpMethod.GET, genericType); + } + + @Override + public Promise<Response> head() { + return method(HttpMethod.HEAD); + } + + @Override + public <R> Promise<R> method(String s, Class<R> responseType) { + + Deferred<R> deferred = _promiseFactory.deferred(); + + _webClient.doInvokeAsync(s, null, null, null, responseType, responseType, + new DeferredHandler<R>(deferred)); + + return deferred.getPromise(); + } + + @Override + public <R> Promise<R> method(String s, Entity<?> entity, Class<R> responseType) { + + Deferred<R> deferred = _promiseFactory.deferred(); + + _webClient.doInvokeAsync(s, entity, null, null, responseType, responseType, + new DeferredHandler<R>(deferred)); + + return deferred.getPromise(); + } + + @Override + public <R> Promise<R> method( + String s, Entity<?> entity, GenericType<R> genericType) { + + Deferred<R> deferred = _promiseFactory.deferred(); + + _webClient.doInvokeAsync(s, entity, null, null, genericType.getRawType(), genericType.getType(), + new DeferredHandler<R>(deferred)); + + return deferred.getPromise(); + } + + @Override + public Promise<Response> method(String s, Entity<?> entity) { + return method(s, entity, Response.class); + } + + @Override + public <R> Promise<R> method(String s, GenericType<R> genericType) { + Deferred<R> deferred = _promiseFactory.deferred(); + + _webClient.doInvokeAsync(s, null, null, null, genericType.getRawType(), genericType.getType(), + new DeferredHandler<R>(deferred)); + + return deferred.getPromise(); + } + + @Override + public Promise<Response> method(String s) { + return method(s, Response.class); + } + + @Override + public Promise<Response> options() { + return method(HttpMethod.OPTIONS); + } + + @Override + public <R> Promise<R> options(Class<R> aClass) { + return method(HttpMethod.OPTIONS, aClass); + } + + @Override + public <R> Promise<R> options(GenericType<R> genericType) { + return method(HttpMethod.OPTIONS, genericType); + } + + @Override + public <R> Promise<R> post(Entity<?> entity, Class<R> aClass) { + return method(HttpMethod.POST, entity, aClass); + } + + @Override + public <R> Promise<R> post(Entity<?> entity, GenericType<R> genericType) { + return method(HttpMethod.POST, entity, genericType); + } + + @Override + public Promise<Response> post(Entity<?> entity) { + return method(HttpMethod.POST, entity); + } + + @Override + public <R> Promise<R> put(Entity<?> entity, Class<R> aClass) { + return method(HttpMethod.PUT, entity, aClass); + } + + @Override + public <R> Promise<R> put(Entity<?> entity, GenericType<R> genericType) { + return method(HttpMethod.PUT, entity, genericType); + } + + @Override + public Promise<Response> put(Entity<?> entity) { + return method(HttpMethod.PUT, entity); + } + + @Override + public Promise<Response> trace() { + return method("TRACE", Response.class); + } + + @Override + public <R> Promise<R> trace(Class<R> aClass) { + return method("TRACE", aClass); + } + + @Override + public <R> Promise<R> trace(GenericType<R> genericType) { + return method("TRACE", genericType); + } + + private final PromiseFactory _promiseFactory; + private final WebClient _webClient; +} http://git-wip-us.apache.org/repos/asf/aries-jax-rs-whiteboard/blob/c62794df/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerProviderImpl.java ---------------------------------------------------------------------- diff --git a/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerProviderImpl.java b/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerProviderImpl.java new file mode 100644 index 0000000..de420e9 --- /dev/null +++ b/jax-rs.whiteboard/src/main/java/org/apache/cxf/jaxrs/client/PromiseRxInvokerProviderImpl.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cxf.jaxrs.client; + +import java.util.concurrent.ExecutorService; + +import javax.ws.rs.client.RxInvokerProvider; +import javax.ws.rs.client.SyncInvoker; + +import org.apache.cxf.jaxrs.client.SyncInvokerImpl; +import org.osgi.service.jaxrs.client.PromiseRxInvoker; +import org.osgi.util.promise.PromiseFactory; + +public class PromiseRxInvokerProviderImpl + implements RxInvokerProvider<PromiseRxInvoker> { + + @Override + public boolean isProviderFor(Class<?> clazz) { + return clazz == PromiseRxInvoker.class; + } + + @Override + public PromiseRxInvoker getRxInvoker( + SyncInvoker syncInvoker, ExecutorService executorService) { + + PromiseFactory promiseFactory; + + if (executorService != null) { + promiseFactory = new PromiseFactory(executorService); + } + else { + promiseFactory = new PromiseFactory( + PromiseFactory.inlineExecutor()); + } + + return new PromiseRxInvokerImpl(((SyncInvokerImpl) syncInvoker).getWebClient(), promiseFactory); + } + +}
