View Javadoc
1   /*******************************************************************************
2    * Copyright 2012 Internet2
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   ******************************************************************************/
16  package edu.internet2.middleware.grouper.ws.samples.rest.membership;
17  
18  import org.apache.commons.httpclient.Credentials;
19  import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
20  import org.apache.commons.httpclient.Header;
21  import org.apache.commons.httpclient.HttpClient;
22  import org.apache.commons.httpclient.UsernamePasswordCredentials;
23  import org.apache.commons.httpclient.auth.AuthScope;
24  import org.apache.commons.httpclient.methods.PostMethod;
25  import org.apache.commons.httpclient.methods.StringRequestEntity;
26  import org.apache.commons.httpclient.params.DefaultHttpParams;
27  import org.apache.commons.httpclient.params.HttpMethodParams;
28  import org.apache.commons.lang.StringUtils;
29  
30  import edu.internet2.middleware.grouper.ws.coresoap.WsGetMembershipsResults;
31  import edu.internet2.middleware.grouper.ws.coresoap.WsGroupLookup;
32  import edu.internet2.middleware.grouper.ws.coresoap.WsSubjectLookup;
33  import edu.internet2.middleware.grouper.ws.rest.WsRestResultProblem;
34  import edu.internet2.middleware.grouper.ws.rest.membership.WsRestGetMembershipsRequest;
35  import edu.internet2.middleware.grouper.ws.samples.types.WsSampleRest;
36  import edu.internet2.middleware.grouper.ws.samples.types.WsSampleRestType;
37  import edu.internet2.middleware.grouper.ws.util.RestClientSettings;
38  
39  /**
40   * @author mchyzer
41   */
42  public class WsSampleGetMembershipsRest2 implements WsSampleRest {
43  
44    /**
45     * get member lite web service with REST
46     * @param wsSampleRestType is the type of rest (xml, xhtml, etc)
47     */
48    public static void getMembershipsLite(WsSampleRestType wsSampleRestType) {
49  
50      try {
51        HttpClient httpClient = new HttpClient();
52        
53        DefaultHttpParams.getDefaultParams().setParameter(
54            HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(0, false));
55  
56        //URL e.g. http://localhost:8093/grouper-ws/servicesRest/v1_3_000/...
57        //NOTE: aStem:aGroup urlencoded substitutes %3A for a colon
58        String url = RestClientSettings.URL + "/" + RestClientSettings.VERSION  
59          + "/memberships";
60        PostMethod method = new PostMethod(
61            url);
62  
63        httpClient.getParams().setAuthenticationPreemptive(true);
64        Credentials defaultcreds = new UsernamePasswordCredentials(RestClientSettings.USER, 
65            RestClientSettings.PASS);
66  
67        //no keep alive so response if easier to indent for tests
68        method.setRequestHeader("Connection", "close");
69        
70        //e.g. localhost and 8093
71        httpClient.getState()
72            .setCredentials(new AuthScope(RestClientSettings.HOST, RestClientSettings.PORT), defaultcreds);
73  
74        //Make the body of the request, in this case with beans and marshaling, but you can make
75        //your request document in whatever language or way you want
76        WsRestGetMembershipsRequest getMemberships = new WsRestGetMembershipsRequest();
77  
78        // seeif two subjects are in the group
79        WsGroupLookup[] groupLookups = new WsGroupLookup[1];
80        groupLookups[0] = new WsGroupLookup("aStem:aGroup", null);
81  
82        getMemberships.setWsGroupLookups(groupLookups);
83        
84        getMemberships.setWsSubjectLookups(new WsSubjectLookup[]{new WsSubjectLookup("test.subject.0", "jdbc", null)});
85        
86        getMemberships.setMemberFilter("Immediate");
87        getMemberships.setFieldName("members");
88        
89        //get the xml / json / xhtml / paramString
90        String requestDocument = wsSampleRestType.getWsLiteRequestContentType().writeString(getMemberships);
91        
92        //make sure right content type is in request (e.g. application/xhtml+xml
93        String contentType = wsSampleRestType.getWsLiteRequestContentType().getContentType();
94        
95        method.setRequestEntity(new StringRequestEntity(requestDocument, contentType, "UTF-8"));
96        
97        httpClient.executeMethod(method);
98  
99        //make sure a request came back
100       Header successHeader = method.getResponseHeader("X-Grouper-success");
101       String successString = successHeader == null ? null : successHeader.getValue();
102       if (StringUtils.isBlank(successString)) {
103         throw new RuntimeException("Web service did not even respond!");
104       }
105       boolean success = "T".equals(successString);
106       String resultCode = method.getResponseHeader("X-Grouper-resultCode").getValue();
107       
108       String response = RestClientSettings.responseBodyAsString(method);
109 
110       Object result = wsSampleRestType
111         .getWsLiteResponseContentType().parseString(response);
112       
113       //see if problem
114       if (result instanceof WsRestResultProblem) {
115         throw new RuntimeException(((WsRestResultProblem)result).getResultMetadata().getResultMessage());
116       }
117       
118       //convert to object (from xhtml, xml, json, etc)
119       WsGetMembershipsResults wsGetMembershipsResults = (WsGetMembershipsResults)result;
120       
121       String resultMessage = wsGetMembershipsResults.getResultMetadata().getResultMessage();
122 
123       // see if request worked or not
124       if (!success) {
125         throw new RuntimeException("Bad response from web service: successString: " + successString + ", resultCode: " + resultCode
126             + ", " + resultMessage);
127       }
128       
129       System.out.println("Server version: " + wsGetMembershipsResults.getResponseMetadata().getServerVersion()
130           + ", result code: " + resultCode
131           + ", result message: " + resultMessage );
132 
133     } catch (Exception e) {
134       throw new RuntimeException(e);
135     }
136 
137   }
138 
139   /**
140    * @param args
141    */
142   public static void main(String[] args) {
143     getMembershipsLite(WsSampleRestType.json);
144   }
145 
146   /**
147    * @see edu.internet2.middleware.grouper.ws.samples.types.WsSampleRest#executeSample(edu.internet2.middleware.grouper.ws.samples.types.WsSampleRestType)
148    */
149   public void executeSample(WsSampleRestType wsSampleRestType) {
150     getMembershipsLite(wsSampleRestType);
151   }
152 
153   /**
154    * @see edu.internet2.middleware.grouper.ws.samples.types.WsSampleRest#validType(edu.internet2.middleware.grouper.ws.samples.types.WsSampleRestType)
155    */
156   public boolean validType(WsSampleRestType wsSampleRestType) {
157     //dont allow http params
158     return !WsSampleRestType.http_json.equals(wsSampleRestType);
159   }
160 }