/* * 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.isis.viewer.restfulobjects.applib.client; import java.net.URI; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.http.client.HttpClient; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.jboss.resteasy.client.ClientExecutor; import org.jboss.resteasy.client.ClientRequestFactory; import org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor; import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation; import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation; import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod; import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainObjectResource; import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainServiceResource; import org.apache.isis.viewer.restfulobjects.applib.domaintypes.DomainTypeResource; import org.apache.isis.viewer.restfulobjects.applib.homepage.HomePageResource; import org.apache.isis.viewer.restfulobjects.applib.user.UserResource; import org.apache.isis.viewer.restfulobjects.applib.version.VersionResource; public class RestfulClient { private final HomePageResource homePageResource; private final UserResource userResource; private final VersionResource versionResource; private final DomainObjectResource domainObjectResource; private final DomainServiceResource domainServiceResource; private final DomainTypeResource domainTypeResource; private final ClientExecutor executor; private final ClientRequestFactory clientRequestFactory; /** * Using {@link ApacheHttpClient4Executor} and {@link DefaultHttpClient}. */ public RestfulClient(final URI baseUri) { this(baseUri, new ThreadSafeClientConnManager()); } /** * Using {@link ApacheHttpClient4Executor} and {@link DefaultHttpClient}. */ public RestfulClient(final URI baseUri, ClientConnectionManager clientConnectionManager) { this(baseUri, new DefaultHttpClient(clientConnectionManager)); } /** * Using {@link ApacheHttpClient4Executor} and specified {@link HttpClient}. */ public RestfulClient(final URI baseUri, HttpClient client) { this(baseUri, new ApacheHttpClient4Executor(client)); } /** * Using arbitrary {@link ClientExecutor} implementation. */ public RestfulClient(final URI baseUri, final ClientExecutor clientExecutor) { this.executor = clientExecutor; this.clientRequestFactory = new ClientRequestFactory(clientExecutor, baseUri); this.homePageResource = clientRequestFactory.createProxy(HomePageResource.class); this.userResource = clientRequestFactory.createProxy(UserResource.class); this.domainTypeResource = clientRequestFactory.createProxy(DomainTypeResource.class); this.domainServiceResource = clientRequestFactory.createProxy(DomainServiceResource.class); this.domainObjectResource = clientRequestFactory.createProxy(DomainObjectResource.class); this.versionResource = clientRequestFactory.createProxy(VersionResource.class); } // /////////////////////////////////////////////////////////////// // resources // /////////////////////////////////////////////////////////////// public HomePageResource getHomePageResource() { return homePageResource; } public UserResource getUserResource() { return userResource; } public VersionResource getVersionResource() { return versionResource; } public DomainTypeResource getDomainTypeResource() { return domainTypeResource; } public DomainObjectResource getDomainObjectResource() { return domainObjectResource; } public DomainServiceResource getDomainServiceResource() { return domainServiceResource; } // /////////////////////////////////////////////////////////////// // resource walking support // /////////////////////////////////////////////////////////////// public RepresentationWalker createWalker(final Response response) { return new RepresentationWalker(this, response); } public RestfulResponse<JsonRepresentation> follow(final LinkRepresentation link) throws Exception { return followT(link); } public <T extends JsonRepresentation> RestfulResponse<T> followT(final LinkRepresentation link) throws Exception { return followT(link, JsonRepresentation.newMap()); } public RestfulResponse<JsonRepresentation> follow(final LinkRepresentation link, final JsonRepresentation requestArgs) throws Exception { return followT(link, requestArgs); } public <T extends JsonRepresentation> RestfulResponse<T> followT(final LinkRepresentation link, final JsonRepresentation requestArgs) throws Exception { return link.<T> follow(executor, requestArgs); } public RestfulRequest createRequest(final RestfulHttpMethod httpMethod, final String uriTemplate) { final boolean includesScheme = uriTemplate.startsWith("http:") || uriTemplate.startsWith("https:"); final String base = clientRequestFactory.getBase().toString(); final String uri = (includesScheme ? "" : base) + uriTemplate; final ClientRequestConfigurer clientRequestConfigurer = ClientRequestConfigurer.create(executor, uri); clientRequestConfigurer.accept(MediaType.APPLICATION_JSON_TYPE); clientRequestConfigurer.setHttpMethod(httpMethod); return new RestfulRequest(clientRequestConfigurer); } /** * exposed for testing purposes only. */ public ClientRequestFactory getClientRequestFactory() { return clientRequestFactory; } }