001/*
002 * Copyright 2011-2016 UnboundID Corp.
003 *
004 * This program is free software; you can redistribute it and/or modify
005 * it under the terms of the GNU General Public License (GPLv2 only)
006 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
007 * as published by the Free Software Foundation.
008 *
009 * This program is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012 * GNU General Public License for more details.
013 *
014 * You should have received a copy of the GNU General Public License
015 * along with this program; if not, see <http://www.gnu.org/licenses>.
016 */
017
018package com.unboundid.scim.wink;
019
020import javax.servlet.http.HttpServletRequest;
021import javax.ws.rs.core.HttpHeaders;
022import javax.ws.rs.core.MediaType;
023import javax.ws.rs.core.SecurityContext;
024import javax.ws.rs.core.UriInfo;
025import java.security.Principal;
026import java.util.List;
027
028import static com.unboundid.scim.sdk.SCIMConstants.*;
029
030
031
032public class RequestContext
033{
034  /**
035   * The HTTP servlet request.
036   */
037  private final HttpServletRequest request;
038
039  /**
040   * The security context of the request.
041   */
042  private final SecurityContext securityContext;
043
044  /**
045   * The HTTP headers of the request.
046   */
047  private final HttpHeaders headers;
048
049  /**
050   * The URI information of the request.
051   */
052  private final UriInfo uriInfo;
053
054  /**
055   * The HTTP authenticated user ID. Not to be confused with a SCIM user ID.
056   */
057  private final String authID;
058
059  /**
060   * The value of the HTTP Origin header.
061   */
062  private final String origin;
063
064  /**
065   * The media type to be consumed, if any.
066   */
067  private final MediaType consumeMediaType;
068
069  /**
070   * The media type to be produced, if any.
071   */
072  private final MediaType produceMediaType;
073
074  /**
075   * The value of the HTTP Content-Length header.
076   */
077  private final long contentLength;
078
079
080
081  /**
082   * Creates the resource implementation for a request.
083   *
084   * @param request   The servlet context for the request.
085   * @param securityContext  The HTTP servlet request.
086   * @param headers          The request headers.
087   * @param uriInfo          The URI info for the request.
088   * @param consumeMediaType The media type to be consumed, if any.
089   * @param produceMediaType The media type to be produced, if any.
090   */
091  public RequestContext(final HttpServletRequest request,
092                        final SecurityContext securityContext,
093                        final HttpHeaders headers,
094                        final UriInfo uriInfo,
095                        final MediaType consumeMediaType,
096                        final MediaType produceMediaType)
097  {
098    this.request = request;
099    this.securityContext  = securityContext;
100    this.headers          = headers;
101    this.uriInfo          = uriInfo;
102    this.consumeMediaType = consumeMediaType;
103    this.produceMediaType = produceMediaType;
104
105    // Determine the authenticated ID for the request.
106    final Principal userPrincipal = securityContext.getUserPrincipal();
107    if (userPrincipal != null)
108    {
109      authID = userPrincipal.getName();
110    }
111    else
112    {
113      authID = null;
114    }
115
116    final List<String> originHeaders =
117        headers.getRequestHeader(HEADER_NAME_ORIGIN);
118    if (originHeaders != null)
119    {
120      origin = originHeaders.get(0);
121    }
122    else
123    {
124      origin = null;
125    }
126
127    final List<String> contentLengthHeaders =
128        headers.getRequestHeader(HttpHeaders.CONTENT_LENGTH);
129    if (contentLengthHeaders != null)
130    {
131      contentLength = Long.parseLong(contentLengthHeaders.get(0));
132    }
133    else
134    {
135      contentLength = -1;
136    }
137  }
138
139
140
141  /**
142   * Retrieve the servlet context of the request.
143   * @return The servlet context of the request.
144   */
145  public HttpServletRequest getRequest()
146  {
147    return request;
148  }
149
150
151
152  /**
153   * Retrieve the security context for the request.
154   * @return The security context for the request.
155   */
156  public SecurityContext getSecurityContext()
157  {
158    return securityContext;
159  }
160
161
162
163  /**
164   * Retrieve the request headers.
165   * @return The request headers.
166   */
167  public HttpHeaders getHeaders()
168  {
169    return headers;
170  }
171
172
173
174  /**
175   * Retrieve the URI info for the request.
176   * @return The URI info for the request.
177   */
178  public UriInfo getUriInfo()
179  {
180    return uriInfo;
181  }
182
183
184
185  /**
186   * Retrieve the HTTP authenticated user ID.
187   * @return The the HTTP authenticated user ID.
188   */
189  public String getAuthID()
190  {
191    return authID;
192  }
193
194
195
196  /**
197   * Retrieve the value of the HTTP Origin header.
198   * @return The value of the HTTP Origin header.
199   */
200  public String getOrigin()
201  {
202    return origin;
203  }
204
205
206
207  /**
208   * Retrieve the media type to be consumed.
209   * @return  The media type to be consumed.
210   */
211  public MediaType getConsumeMediaType()
212  {
213    return consumeMediaType;
214  }
215
216
217
218  /**
219   * Retrieve the media type to be produced.
220   * @return  The media type to be produced.
221   */
222  public MediaType getProduceMediaType()
223  {
224    return produceMediaType;
225  }
226
227
228
229  /**
230   * Retrieve the value of the HTTP Content-Length header.
231   * @return The value of the HTTP Content-Length header, or -1 if it is
232   *         not present.
233   */
234  public long getContentLength()
235  {
236    return contentLength;
237  }
238}