001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.apache.isis.viewer.restfulobjects.applib.client; 020 021import java.net.URI; 022 023import javax.ws.rs.core.MediaType; 024import javax.ws.rs.core.Response; 025 026import org.apache.http.impl.client.DefaultHttpClient; 027import org.jboss.resteasy.client.ClientExecutor; 028import org.jboss.resteasy.client.ClientRequestFactory; 029import org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor; 030 031import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation; 032import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation; 033import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod; 034import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainObjectResource; 035import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainServiceResource; 036import org.apache.isis.viewer.restfulobjects.applib.domaintypes.DomainTypeResource; 037import org.apache.isis.viewer.restfulobjects.applib.homepage.HomePageResource; 038import org.apache.isis.viewer.restfulobjects.applib.user.UserResource; 039import org.apache.isis.viewer.restfulobjects.applib.version.VersionResource; 040 041public class RestfulClient { 042 043 private final HomePageResource homePageResource; 044 private final UserResource userResource; 045 private final VersionResource versionResource; 046 private final DomainObjectResource domainObjectResource; 047 private final DomainServiceResource domainServiceResource; 048 private final DomainTypeResource domainTypeResource; 049 050 private final ClientExecutor executor; 051 private final ClientRequestFactory clientRequestFactory; 052 053 public RestfulClient(final URI baseUri) { 054 this(baseUri, new ApacheHttpClient4Executor(new DefaultHttpClient())); 055 } 056 057 public RestfulClient(final URI baseUri, final ClientExecutor clientExecutor) { 058 this.executor = clientExecutor; 059 this.clientRequestFactory = new ClientRequestFactory(clientExecutor, baseUri); 060 061 this.homePageResource = clientRequestFactory.createProxy(HomePageResource.class); 062 this.userResource = clientRequestFactory.createProxy(UserResource.class); 063 this.domainTypeResource = clientRequestFactory.createProxy(DomainTypeResource.class); 064 this.domainServiceResource = clientRequestFactory.createProxy(DomainServiceResource.class); 065 this.domainObjectResource = clientRequestFactory.createProxy(DomainObjectResource.class); 066 this.versionResource = clientRequestFactory.createProxy(VersionResource.class); 067 } 068 069 // /////////////////////////////////////////////////////////////// 070 // resources 071 // /////////////////////////////////////////////////////////////// 072 073 public HomePageResource getHomePageResource() { 074 return homePageResource; 075 } 076 077 public UserResource getUserResource() { 078 return userResource; 079 } 080 081 public VersionResource getVersionResource() { 082 return versionResource; 083 } 084 085 public DomainTypeResource getDomainTypeResource() { 086 return domainTypeResource; 087 } 088 089 public DomainObjectResource getDomainObjectResource() { 090 return domainObjectResource; 091 } 092 093 public DomainServiceResource getDomainServiceResource() { 094 return domainServiceResource; 095 } 096 097 // /////////////////////////////////////////////////////////////// 098 // resource walking support 099 // /////////////////////////////////////////////////////////////// 100 101 public RepresentationWalker createWalker(final Response response) { 102 return new RepresentationWalker(this, response); 103 } 104 105 public RestfulResponse<JsonRepresentation> follow(final LinkRepresentation link) throws Exception { 106 return followT(link); 107 } 108 109 public <T extends JsonRepresentation> RestfulResponse<T> followT(final LinkRepresentation link) throws Exception { 110 return followT(link, JsonRepresentation.newMap()); 111 } 112 113 public RestfulResponse<JsonRepresentation> follow(final LinkRepresentation link, final JsonRepresentation requestArgs) throws Exception { 114 return followT(link, requestArgs); 115 } 116 117 public <T extends JsonRepresentation> RestfulResponse<T> followT(final LinkRepresentation link, final JsonRepresentation requestArgs) throws Exception { 118 return link.<T> follow(executor, requestArgs); 119 } 120 121 public RestfulRequest createRequest(final RestfulHttpMethod httpMethod, final String uriTemplate) { 122 123 final boolean includesScheme = uriTemplate.startsWith("http:") || uriTemplate.startsWith("https:"); 124 final String base = clientRequestFactory.getBase().toString(); 125 final String uri = (includesScheme ? "" : base) + uriTemplate; 126 127 final ClientRequestConfigurer clientRequestConfigurer = ClientRequestConfigurer.create(executor, uri); 128 129 clientRequestConfigurer.accept(MediaType.APPLICATION_JSON_TYPE); 130 clientRequestConfigurer.setHttpMethod(httpMethod); 131 132 return new RestfulRequest(clientRequestConfigurer); 133 } 134 135 /** 136 * exposed for testing purposes only. 137 */ 138 public ClientRequestFactory getClientRequestFactory() { 139 return clientRequestFactory; 140 } 141 142}