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}