You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/07/17 19:03:37 UTC

svn commit: r1504203 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/ rt/rs/client/src/main/java/org/apache/c...

Author: sergeyb
Date: Wed Jul 17 17:03:36 2013
New Revision: 1504203

URL: http://svn.apache.org/r1504203
Log:
[CXF-5135] Prototyping the code to get 2.0 fluent API supported, more to follow

Added:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java   (with props)
    cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientBuilderImpl.java   (with props)
    cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java   (with props)
    cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ConfigurableImpl.java   (with props)
    cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/InvocationBuilderImpl.java   (with props)
    cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/TLSConfiguration.java   (with props)
    cxf/trunk/rt/rs/client/src/main/resources/META-INF/services/
    cxf/trunk/rt/rs/client/src/main/resources/META-INF/services/javax.ws.rs.client.ClientBuilder
Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
    cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java?rev=1504203&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java Wed Jul 17 17:03:36 2013
@@ -0,0 +1,105 @@
+/**
+ * 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.impl;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ws.rs.RuntimeType;
+import javax.ws.rs.core.Configuration;
+import javax.ws.rs.core.Feature;
+
+public class ConfigurationImpl implements Configuration {
+
+    public ConfigurationImpl() {
+        
+    }
+    
+    public ConfigurationImpl(Configuration parent) {
+        
+    }
+    
+    @Override
+    public Set<Class<?>> getClasses() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Map<Class<?>, Integer> getContracts(Class<?> arg0) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Set<Object> getInstances() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Map<String, Object> getProperties() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Object getProperty(String arg0) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Collection<String> getPropertyNames() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public RuntimeType getRuntimeType() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean isEnabled(Feature arg0) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean isEnabled(Class<? extends Feature> arg0) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean isRegistered(Object arg0) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean isRegistered(Class<?> arg0) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ConfigurationImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java?rev=1504203&r1=1504202&r2=1504203&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java Wed Jul 17 17:03:36 2013
@@ -580,4 +580,8 @@ public final class HttpUtils {
         return relative.resolve(relToCommon);
         
     }
+    
+    public static String toHttpLanguage(Locale locale) {
+        return Headers.toHttpLanguage(locale);
+    }
 }

Modified: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=1504203&r1=1504202&r2=1504203&view=diff
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Wed Jul 17 17:03:36 2013
@@ -1245,12 +1245,14 @@ public class WebClient extends AbstractC
     }
     
     private void setEntityHeaders(Entity<?> entity) {
-        type(entity.getMediaType());
-        if (entity.getLanguage() != null) {
-            language(entity.getLanguage().toString());
-        }
-        if (entity.getEncoding() != null) {
-            encoding(entity.getEncoding());
+        if (entity != null) {
+            type(entity.getMediaType());
+            if (entity.getLanguage() != null) {
+                language(entity.getLanguage().toString());
+            }
+            if (entity.getEncoding() != null) {
+                encoding(entity.getEncoding());
+            }
         }
     }
     
@@ -1415,22 +1417,29 @@ public class WebClient extends AbstractC
         @Override
         public <T> Future<T> method(String name, Entity<?> entity, Class<T> responseType) {
             WebClient.this.setEntityHeaders(entity);
-            return doInvokeAsync(name, entity.getEntity(), entity.getEntity().getClass(), null, 
-                                 responseType, responseType, null);
+            return doInvokeAsync(name, 
+                                 entity == null ? null : entity.getEntity(), 
+                                 entity == null ? null : entity.getEntity().getClass(), 
+                                 null, responseType, responseType, null);
         }
 
         @Override
         public <T> Future<T> method(String name, Entity<?> entity, GenericType<T> responseType) {
             WebClient.this.setEntityHeaders(entity);
-            return doInvokeAsync(name, entity.getEntity(), entity.getEntity().getClass(), null, 
-                                 responseType.getRawType(), responseType.getType(), null);
+            return doInvokeAsync(name, 
+                                 entity == null ? null : entity.getEntity(), 
+                                 entity == null ? null : entity.getEntity().getClass(), 
+                                 null, responseType.getRawType(), responseType.getType(), null);
         }
 
         @Override
         public <T> Future<T> method(String name, Entity<?> entity, InvocationCallback<T> callback) {
             WebClient.this.setEntityHeaders(entity);
-            return doInvokeAsyncCallback(name, entity.getEntity(), entity.getEntity().getClass(), null, 
-                callback);
+            return doInvokeAsyncCallback(name, 
+                                         entity.getEntity(), 
+                                         entity.getEntity().getClass(), 
+                                         null, 
+                                         callback);
         }
     }
     
@@ -1556,13 +1565,17 @@ public class WebClient extends AbstractC
         @Override
         public <T> T method(String method, Entity<?> entity, Class<T> cls) {
             WebClient.this.setEntityHeaders(entity);
-            return invoke(method, entity.getEntity(), cls);
+            return invoke(method, 
+                          entity == null ? null : entity.getEntity(), 
+                          cls);
         }
 
         @Override
         public <T> T method(String method, Entity<?> entity, GenericType<T> genericType) {
             WebClient.this.setEntityHeaders(entity);
-            return invoke(method, entity.getEntity(), genericType);
+            return invoke(method, 
+                          entity == null ? null : entity.getEntity(), 
+                          genericType);
         }
     }
 }

Added: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientBuilderImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientBuilderImpl.java?rev=1504203&view=auto
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientBuilderImpl.java (added)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientBuilderImpl.java Wed Jul 17 17:03:36 2013
@@ -0,0 +1,124 @@
+/**
+ * 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.spec;
+
+import java.security.KeyStore;
+import java.util.Map;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.core.Configuration;
+
+public class ClientBuilderImpl extends ClientBuilder {
+
+    private ConfigurableImpl<ClientBuilder> configImpl = new ConfigurableImpl<ClientBuilder>();
+    private TLSConfiguration secConfig = new TLSConfiguration();
+    
+    public ClientBuilderImpl() {
+        System.out.println();    
+    }
+    
+    @Override
+    public Configuration getConfiguration() {
+        return configImpl.getConfiguration();
+    }
+
+    @Override
+    public ClientBuilder property(String name, Object value) {
+        return configImpl.property(name, value);
+    }
+
+    @Override
+    public ClientBuilder register(Class<?> cls) {
+        return configImpl.register(cls);
+    }
+
+    @Override
+    public ClientBuilder register(Object object) {
+        return configImpl.register(object);
+    }
+
+    @Override
+    public ClientBuilder register(Class<?> cls, int index) {
+        return configImpl.register(cls, index);
+    }
+
+    @Override
+    public ClientBuilder register(Class<?> cls, Class<?>... contracts) {
+        return configImpl.register(cls, contracts);
+    }
+
+    @Override
+    public ClientBuilder register(Class<?> cls, Map<Class<?>, Integer> map) {
+        return configImpl.register(cls, map);
+    }
+
+    @Override
+    public ClientBuilder register(Object object, int index) {
+        return configImpl.register(object, index);
+    }
+
+    @Override
+    public ClientBuilder register(Object object, Class<?>... contracts) {
+        return configImpl.register(object, contracts);
+    }
+
+    @Override
+    public ClientBuilder register(Object object, Map<Class<?>, Integer> map) {
+        return configImpl.register(object, map);
+    }
+
+    @Override
+    public Client build() {
+        return new ClientImpl(configImpl.getConfiguration(), secConfig);
+    }
+
+    @Override
+    public ClientBuilder hostnameVerifier(HostnameVerifier verifier) {
+        secConfig.setVerifier(verifier);
+        return this;
+    }
+
+    @Override
+    public ClientBuilder sslContext(SSLContext sslContext) {
+        secConfig.setSslContext(sslContext);
+        return this;
+    }
+
+    @Override
+    public ClientBuilder keyStore(KeyStore store, char[] password) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    @Override
+    public ClientBuilder trustStore(KeyStore store) {
+        secConfig.setTrustStore(store);
+        return this;
+    }
+
+    @Override
+    public ClientBuilder withConfig(Configuration cfg) {
+        configImpl = new ConfigurableImpl<ClientBuilder>(cfg);
+        return this;
+    }
+
+}

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientBuilderImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientBuilderImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java?rev=1504203&view=auto
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java (added)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java Wed Jul 17 17:03:36 2013
@@ -0,0 +1,214 @@
+/**
+ * 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.spec;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Invocation.Builder;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Configuration;
+import javax.ws.rs.core.Link;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+
+import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean;
+import org.apache.cxf.jaxrs.client.WebClient;
+
+public class ClientImpl extends ConfigurableImpl<Client> implements Client {
+    private TLSConfiguration secConfig;
+    private boolean closed;
+    private WebClient template;
+    public ClientImpl(Configuration config,
+                      TLSConfiguration secConfig) {
+        super(config);
+        this.secConfig = secConfig;
+    }
+    
+    @Override
+    public void close() {
+        if (!closed) {
+            if (template != null) {
+                template.close();
+                template = null;
+            }
+            closed = true;
+        }
+        
+    }
+
+    @Override
+    public Builder invocation(Link link) {
+        checkClosed();
+        return target(link.getUriBuilder()).request();
+    }
+
+    @Override
+    public WebTarget target(UriBuilder builder) {
+        checkClosed();
+        initWebClientTemplateIfNeeded();
+        return new WebTargetImpl(builder, getConfiguration(), template);
+    }
+
+    private void initWebClientTemplateIfNeeded() {
+        // This is done to make the creation of individual targets really easy
+        if (template == null) {
+            JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean();
+            bean.setAddress("http://tempuri");
+            // handle Configuration providers
+            this.template = bean.createWebClient();
+        }
+    }
+    
+    @Override
+    public WebTarget target(String address) {
+        return target(UriBuilder.fromUri(address));
+    }
+    
+    @Override
+    public WebTarget target(Link link) {
+        return target(link.getUriBuilder());
+    }
+
+    @Override
+    public WebTarget target(URI uri) {
+        return target(UriBuilder.fromUri(uri));
+    }
+
+    
+    @Override
+    public HostnameVerifier getHostnameVerifier() {
+        checkClosed();
+        return secConfig.getVerifier();
+    }
+
+    @Override
+    public SSLContext getSslContext() {
+        checkClosed();
+        return secConfig.getSslContext();
+    }
+    
+    private void checkClosed() {
+        if (closed) {
+            throw new IllegalStateException();
+        }
+    }
+    
+    class WebTargetImpl extends ConfigurableImpl<WebTarget> implements WebTarget {
+        private UriBuilder uriBuilder;
+        private WebClient template; 
+        
+        public WebTargetImpl(UriBuilder uriBuilder, 
+                              Configuration config, 
+                              WebClient template) {
+            super(config);
+            this.uriBuilder = uriBuilder.clone();
+            this.template = template;
+        }
+        
+        @Override
+        public Builder request() {
+            checkClosed();
+            WebClient wc = WebClient.fromClient(template).to(uriBuilder.build().toString(), false);
+            return new InvocationBuilderImpl(wc);
+        }
+
+        @Override
+        public Builder request(String... accept) {
+            return request().accept(accept);
+        }
+
+        @Override
+        public Builder request(MediaType... accept) {
+            return request().accept(accept);
+        }
+
+        @Override
+        public URI getUri() {
+            checkClosed();
+            return uriBuilder.build();
+        }
+
+        @Override
+        public UriBuilder getUriBuilder() {
+            checkClosed();
+            return uriBuilder.clone();
+        }
+
+        @Override
+        public WebTarget matrixParam(String name, Object... values) {
+            return newWebTarget(getUriBuilder().matrixParam(name, values));
+        }
+        
+        @Override
+        public WebTarget path(String path) {
+            return newWebTarget(getUriBuilder().path(path));
+        }
+
+        @Override
+        public WebTarget queryParam(String name, Object... values) {
+            return newWebTarget(getUriBuilder().queryParam(name, values));
+        }
+
+        @Override
+        public WebTarget resolveTemplate(String name, Object value) {
+            return resolveTemplate(name, value, true);
+        }
+
+        @Override
+        public WebTarget resolveTemplate(String name, Object value, boolean encodeSlash) {
+            return newWebTarget(getUriBuilder().resolveTemplate(name, value, encodeSlash));
+        }
+
+        @Override
+        public WebTarget resolveTemplateFromEncoded(String name, Object value) {
+            return newWebTarget(getUriBuilder().resolveTemplateFromEncoded(name, value));
+        }
+
+        @Override
+        public WebTarget resolveTemplates(Map<String, Object> templatesMap) {
+            return resolveTemplates(templatesMap, true);
+        }
+
+        @Override
+        public WebTarget resolveTemplates(Map<String, Object> templatesMap, boolean encodeSlash) {
+            checkClosed();
+            if (templatesMap.isEmpty()) {
+                return this;
+            }
+            return newWebTarget(getUriBuilder().resolveTemplates(templatesMap, encodeSlash));
+        }
+
+        @Override
+        public WebTarget resolveTemplatesFromEncoded(Map<String, Object> templatesMap) {
+            checkClosed();
+            if (templatesMap.isEmpty()) {
+                return this;
+            }
+            return newWebTarget(getUriBuilder().resolveTemplatesFromEncoded(templatesMap));
+        }
+        
+        private WebTarget newWebTarget(UriBuilder newBuilder) {
+            return new WebTargetImpl(newBuilder, getConfiguration(), template);
+        }
+    }
+}

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ConfigurableImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ConfigurableImpl.java?rev=1504203&view=auto
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ConfigurableImpl.java (added)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ConfigurableImpl.java Wed Jul 17 17:03:36 2013
@@ -0,0 +1,98 @@
+/**
+ * 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.spec;
+
+import java.util.Map;
+
+import javax.ws.rs.core.Configurable;
+import javax.ws.rs.core.Configuration;
+
+import org.apache.cxf.jaxrs.impl.ConfigurationImpl;
+
+public class ConfigurableImpl<C extends Configurable<C>> implements Configurable<C> {
+    private Configuration config;
+    protected ConfigurableImpl() {
+        this(new ConfigurationImpl());
+    }
+    
+    protected ConfigurableImpl(Configuration config) {
+        this.config = config;
+    }
+    
+    @Override
+    public Configuration getConfiguration() {
+        return config;
+    }
+
+    @Override
+    public C property(String arg0, Object arg1) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Class<?> arg0) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Object arg0) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Class<?> arg0, int arg1) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Class<?> arg0, Class<?>... arg1) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Class<?> arg0, Map<Class<?>, Integer> arg1) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Object arg0, int arg1) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Object arg0, Class<?>... arg1) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public C register(Object arg0, Map<Class<?>, Integer> arg1) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ConfigurableImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ConfigurableImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/InvocationBuilderImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/InvocationBuilderImpl.java?rev=1504203&view=auto
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/InvocationBuilderImpl.java (added)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/InvocationBuilderImpl.java Wed Jul 17 17:03:36 2013
@@ -0,0 +1,353 @@
+/**
+ * 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.spec;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.Future;
+
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.client.AsyncInvoker;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.Invocation.Builder;
+import javax.ws.rs.client.InvocationCallback;
+import javax.ws.rs.client.SyncInvoker;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Cookie;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.utils.HttpUtils;
+
+public class InvocationBuilderImpl implements Invocation.Builder {
+    private static final String PROPERTY_KEY = "jaxrs.filter.properties";
+    
+    private WebClient webClient;
+    private SyncInvoker sync;
+    
+    public InvocationBuilderImpl(WebClient webClient) {
+        this.webClient = webClient;
+        this.sync = webClient.sync();
+    }
+    
+    @Override
+    public Response delete() {
+        return sync.delete();
+    }
+
+    @Override
+    public <T> T delete(Class<T> cls) {
+        return sync.delete(cls);
+    }
+
+    @Override
+    public <T> T delete(GenericType<T> type) {
+        return sync.delete(type);
+    }
+
+    @Override
+    public Response get() {
+        return sync.get();
+    }
+
+    @Override
+    public <T> T get(Class<T> cls) {
+        return sync.get(cls);
+    }
+
+    @Override
+    public <T> T get(GenericType<T> type) {
+        return sync.get(type);
+    }
+
+    @Override
+    public Response head() {
+        return sync.head();
+    }
+
+    @Override
+    public Response method(String method) {
+        return sync.method(method);
+    }
+
+    @Override
+    public <T> T method(String method, Class<T> cls) {
+        return sync.method(method, cls);
+    }
+
+    @Override
+    public <T> T method(String method, GenericType<T> type) {
+        return sync.method(method, type);
+    }
+
+    @Override
+    public Response method(String method, Entity<?> entity) {
+        return sync.method(method, entity);
+    }
+
+    @Override
+    public <T> T method(String method, Entity<?> entity, Class<T> cls) {
+        return sync.method(method, entity, cls);
+    }
+
+    @Override
+    public <T> T method(String method, Entity<?> entity, GenericType<T> type) {
+        return sync.method(method, entity, type);
+    }
+
+    @Override
+    public Response options() {
+        return sync.options();
+    }
+
+    @Override
+    public <T> T options(Class<T> cls) {
+        return sync.options(cls);
+    }
+
+    @Override
+    public <T> T options(GenericType<T> type) {
+        return sync.options(type);
+    }
+
+    @Override
+    public Response post(Entity<?> entity) {
+        return sync.post(entity);
+    }
+
+    @Override
+    public <T> T post(Entity<?> entity, Class<T> cls) {
+        return sync.post(entity, cls);
+    }
+
+    @Override
+    public <T> T post(Entity<?> entity, GenericType<T> type) {
+        return sync.post(entity, type);
+    }
+
+    @Override
+    public Response put(Entity<?> entity) {
+        return sync.put(entity);
+    }
+
+    @Override
+    public <T> T put(Entity<?> entity, Class<T> cls) {
+        return sync.put(entity, cls);
+    }
+
+    @Override
+    public <T> T put(Entity<?> entity, GenericType<T> type) {
+        return sync.put(entity, type);
+    }
+
+    @Override
+    public Response trace() {
+        return sync.trace();
+    }
+
+    @Override
+    public <T> T trace(Class<T> cls) {
+        return sync.trace(cls);
+    }
+
+    @Override
+    public <T> T trace(GenericType<T> type) {
+        return sync.trace(type);
+    }
+
+    @Override
+    public Builder accept(String... types) {
+        webClient.accept(types);
+        return this;
+    }
+
+    @Override
+    public Builder accept(MediaType... types) {
+        webClient.accept(types);
+        return this;
+    }
+
+    @Override
+    public Builder acceptEncoding(String... enc) {
+        webClient.acceptEncoding(enc);
+        return this;
+        
+    }
+
+    @Override
+    public Builder acceptLanguage(Locale... lang) {
+        for (Locale l : lang) {
+            webClient.acceptLanguage(HttpUtils.toHttpLanguage(l));
+        }
+        return this;
+    }
+
+    @Override
+    public Builder acceptLanguage(String... lang) {
+        webClient.acceptLanguage(lang);
+        return this;
+    }
+
+    @Override
+    public Builder cacheControl(CacheControl control) {
+        webClient.header(HttpHeaders.CACHE_CONTROL, control.toString());
+        return this;
+    }
+
+    @Override
+    public Builder cookie(Cookie cookie) {
+        webClient.cookie(cookie);
+        return this;
+    }
+
+    @Override
+    public Builder cookie(String name, String value) {
+        webClient.header(HttpHeaders.COOKIE, name + "=" + value);
+        return this;
+    }
+
+    @Override
+    public Builder header(String name, Object value) {
+        webClient.header(name, value);
+        return this;
+    }
+
+    @Override
+    public Builder headers(MultivaluedMap<String, Object> headers) {
+        
+        return this;
+    }
+
+    @Override
+    public Builder property(String name, Object value) {
+        Map<String, Object> contextProps = WebClient.getConfig(webClient).getRequestContext();
+        Map<String, Object> filterProps = CastUtils.cast((Map<?, ?>)contextProps.get(PROPERTY_KEY));
+        if (filterProps == null) {
+            filterProps = new HashMap<String, Object>();
+            contextProps.put(PROPERTY_KEY, filterProps);
+        }
+        if (value == null) {
+            filterProps.remove(name);
+        } else {
+            filterProps.put(name, value);
+        }
+        return this;
+    }
+    
+    @Override
+    public AsyncInvoker async() {
+        return webClient.async();
+    }
+
+    @Override
+    public Invocation build(String method) {
+        return new InvocationImpl(method);
+    }
+
+    @Override
+    public Invocation build(String method, Entity<?> entity) {
+        return new InvocationImpl(method, entity);
+    }
+
+    @Override
+    public Invocation buildDelete() {
+        return build(HttpMethod.DELETE);
+    }
+
+    @Override
+    public Invocation buildGet() {
+        return build(HttpMethod.GET);
+    }
+
+    @Override
+    public Invocation buildPost(Entity<?> entity) {
+        return build(HttpMethod.POST, entity);
+    }
+
+    @Override
+    public Invocation buildPut(Entity<?> entity) {
+        return build(HttpMethod.PUT, entity);
+    }
+    
+    private class InvocationImpl implements Invocation {
+
+        private Invocation.Builder invBuilder;
+        private String httpMethod;
+        private Entity<?> entity;
+        
+        public InvocationImpl(String httpMethod) {
+            this(httpMethod, null);
+        }
+        
+        public InvocationImpl(String httpMethod, Entity<?> entity) {
+            this.invBuilder = InvocationBuilderImpl.this;
+            this.httpMethod = httpMethod;
+            this.entity = entity;
+        }
+        
+        @Override
+        public Response invoke() {
+            return invBuilder.method(httpMethod, entity);
+        }
+
+        @Override
+        public <T> T invoke(Class<T> cls) {
+            return invBuilder.method(httpMethod, entity, cls);
+        }
+
+        @Override
+        public <T> T invoke(GenericType<T> type) {
+            return invBuilder.method(httpMethod, entity, type);
+        }
+
+        @Override
+        public Invocation property(String name, Object value) {
+            invBuilder.property(name, value);
+            return this;
+        }
+
+        @Override
+        public Future<Response> submit() {
+            return invBuilder.async().method(httpMethod, entity);
+        }
+
+        @Override
+        public <T> Future<T> submit(Class<T> cls) {
+            return invBuilder.async().method(httpMethod, entity, cls);
+        }
+
+        @Override
+        public <T> Future<T> submit(GenericType<T> type) {
+            return invBuilder.async().method(httpMethod, entity, type);
+        }
+
+        @Override
+        public <T> Future<T> submit(InvocationCallback<T> callback) {
+            return invBuilder.async().method(httpMethod, entity, callback);
+        }
+
+    }
+}

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/InvocationBuilderImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/InvocationBuilderImpl.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/TLSConfiguration.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/TLSConfiguration.java?rev=1504203&view=auto
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/TLSConfiguration.java (added)
+++ cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/TLSConfiguration.java Wed Jul 17 17:03:36 2013
@@ -0,0 +1,49 @@
+/**
+ * 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.spec;
+
+import java.security.KeyStore;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+
+
+public class TLSConfiguration {
+    private SSLContext sslContext;
+    private HostnameVerifier verifier;
+    private KeyStore trustStore;
+    public SSLContext getSslContext() {
+        return sslContext;
+    }
+    public void setSslContext(SSLContext sslContext) {
+        this.sslContext = sslContext;
+    }
+    public HostnameVerifier getVerifier() {
+        return verifier;
+    }
+    public void setVerifier(HostnameVerifier verifier) {
+        this.verifier = verifier;
+    }
+    public KeyStore getTrustStore() {
+        return trustStore;
+    }
+    public void setTrustStore(KeyStore trustStore) {
+        this.trustStore = trustStore;
+    }
+}

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/TLSConfiguration.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/TLSConfiguration.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/rs/client/src/main/resources/META-INF/services/javax.ws.rs.client.ClientBuilder
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/rs/client/src/main/resources/META-INF/services/javax.ws.rs.client.ClientBuilder?rev=1504203&view=auto
==============================================================================
--- cxf/trunk/rt/rs/client/src/main/resources/META-INF/services/javax.ws.rs.client.ClientBuilder (added)
+++ cxf/trunk/rt/rs/client/src/main/resources/META-INF/services/javax.ws.rs.client.ClientBuilder Wed Jul 17 17:03:36 2013
@@ -0,0 +1 @@
+org.apache.cxf.jaxrs.client.spec.ClientBuilderImpl
\ No newline at end of file

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java?rev=1504203&r1=1504202&r2=1504203&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java Wed Jul 17 17:03:36 2013
@@ -27,6 +27,7 @@ import java.util.concurrent.ExecutionExc
 import java.util.concurrent.Future;
 
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.ClientRequestContext;
 import javax.ws.rs.client.ClientRequestFilter;
 import javax.ws.rs.client.ClientResponseContext;
@@ -103,6 +104,14 @@ public class JAXRS20ClientServerBookTest
     }
     
     @Test
+    public void testGetBookSpec() {
+        String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
+        Book book = ClientBuilder.newClient().target(address)
+            .request("application/xml").get(Book.class);
+        assertEquals(124L, book.getId());
+    }
+    
+    @Test
     public void testGetBookSyncWithAsync() {
         String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
         doTestGetBook(address, true);