001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.apache.juneau.rest.server.httppart;
018
019import static org.apache.juneau.commons.httppart.HttpPartType.*;
020
021import java.lang.reflect.*;
022import java.util.regex.*;
023
024import org.apache.juneau.http.*;
025import org.apache.juneau.http.header.*;
026import org.apache.juneau.marshall.*;
027import org.apache.juneau.marshall.httppart.*;
028import org.apache.juneau.rest.server.*;
029
030/**
031 * Represents a single header on an HTTP request.
032 *
033 * <p>
034 * Typically accessed through the {@link RequestHeaderList} class.
035 *
036 * <p>
037 *    Some important methods on this class are:
038 * </p>
039 * <ul class='javatree'>
040 *    <li class='jc'>{@link RequestHeader}
041 *    <ul class='spaced-list'>
042 *       <li>Methods for retrieving simple string values:
043 *       <ul class='javatreec'>
044 *          <li class='jm'>{@link RequestHeader#asString() asString()}
045 *          <li class='jm'>{@link RequestHeader#get() get()}
046 *          <li class='jm'>{@link RequestHeader#isPresent() isPresent()}
047 *          <li class='jm'>{@link RequestHeader#orElse(String) orElse(String)}
048 *       </ul>
049 *       <li>Methods for retrieving as other common types:
050 *       <ul class='javatreec'>
051 *          <li class='jm'>{@link RequestHeader#asBoolean() asBoolean()}
052 *          <li class='jm'>{@link RequestHeader#asBooleanHeader() asBooleanHeader()}
053 *          <li class='jm'>{@link RequestHeader#asCsvArray() asCsvArray()}
054 *          <li class='jm'>{@link RequestHeader#asCsvHeader() asCsvHeader()}
055 *          <li class='jm'>{@link RequestHeader#asDate() asDate()}
056 *          <li class='jm'>{@link RequestHeader#asDateHeader() asDateHeader()}
057 *          <li class='jm'>{@link RequestHeader#asEntityTagsHeader() asEntityTagsHeader()}
058 *          <li class='jm'>{@link RequestHeader#asEntityTagHeader() asEntityTagHeader()}
059 *          <li class='jm'>{@link RequestHeader#asInteger() asInteger()}
060 *          <li class='jm'>{@link RequestHeader#asIntegerHeader() asIntegerHeader()}
061 *          <li class='jm'>{@link RequestHeader#asLong() asLong()}
062 *          <li class='jm'>{@link RequestHeader#asLongHeader() asLongHeader()}
063 *          <li class='jm'>{@link RequestHeader#asMatcher(Pattern) asMatcher(Pattern)}
064 *          <li class='jm'>{@link RequestHeader#asMatcher(String) asMatcher(String)}
065 *          <li class='jm'>{@link RequestHeader#asMatcher(String,int) asMatcher(String,int)}
066 *          <li class='jm'>{@link RequestHeader#asStringHeader() asStringHeader()}
067 *          <li class='jm'>{@link RequestHeader#asStringRangesHeader() asStringRangesHeader()}
068 *          <li class='jm'>{@link RequestHeader#asUriHeader() asUriHeader()}
069 *       </ul>
070 *       <li>Methods for retrieving as custom types:
071 *       <ul class='javatreec'>
072 *          <li class='jm'>{@link RequestHeader#as(Class) as(Class)}
073 *          <li class='jm'>{@link RequestHeader#as(ClassMeta) as(ClassMeta)}
074 *          <li class='jm'>{@link RequestHeader#as(Type,Type...) as(Type,Type...)}
075 *          <li class='jm'>{@link RequestHeader#parser(HttpPartParserSession) parser(HttpPartParserSession)}
076 *          <li class='jm'>{@link RequestHeader#schema(HttpPartSchema) schema(HttpPartSchema)}
077 *       </ul>
078 *       <li>Methods for performing assertion checks:
079 *       <ul class='javatreec'>
080 *          <li class='jm'>{@link RequestHeader#assertCsvArray() assertCsvArray()}
081 *          <li class='jm'>{@link RequestHeader#assertDate() assertDate()}
082 *          <li class='jm'>{@link RequestHeader#assertInteger() assertInteger()}
083 *          <li class='jm'>{@link RequestHeader#assertLong() assertLong()}
084 *          <li class='jm'>{@link RequestHeader#assertString() assertString()}
085 *       </ul>
086 *       <li>Other methods:
087 *       <ul class='javatreec'>
088 *          <li class='jm'>{@link RequestHeader#getName() getName()}
089 *          <li class='jm'>{@link RequestHeader#getValue() getValue()}
090*     </ul>
091 * </ul>
092 *
093 * <h5 class='section'>See Also:</h5><ul>
094 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/RestServerHttpParts">HTTP parts in REST servers</a>
095 * </ul>
096 */
097public class RequestHeader extends RequestHttpPart implements HttpHeader {
098
099   /**
100    * Constructor.
101    *
102    * @param request The request object.
103    * @param name The header name.
104    * @param value The header value.
105    */
106   public RequestHeader(RestRequest request, String name, String value) {
107      super(HEADER, request, name, value);
108   }
109
110   /**
111    * Returns the value of this header as an {@link HttpBooleanHeader}.
112    *
113    * @return The value of this header as an {@link HttpBooleanHeader}, never <jk>null</jk>.
114    */
115   public HttpBooleanHeader asBooleanHeader() {
116      return HttpBooleanHeader.of(getName(), getValue());
117   }
118
119   /**
120    * Returns the value of this header as an {@link HttpCsvHeader}.
121    *
122    * @return The value of this header as an {@link HttpCsvHeader}, never <jk>null</jk>.
123    */
124   public HttpCsvHeader asCsvHeader() {
125      return HttpCsvHeader.of(getName(), getValue());
126   }
127
128   /**
129    * Returns the value of this header as an {@link HttpDateHeader}.
130    *
131    * @return The value of this header as an {@link HttpDateHeader}, never <jk>null</jk>.
132    */
133   public HttpDateHeader asDateHeader() {
134      return HttpDateHeader.of(getName(), getValue());
135   }
136
137   /**
138    * Returns the value of this header as an {@link HttpEntityTagHeader}.
139    *
140    * @return The value of this header as an {@link HttpEntityTagHeader}, never <jk>null</jk>.
141    */
142   public HttpEntityTagHeader asEntityTagHeader() {
143      return HttpEntityTagHeader.of(getName(), getValue());
144   }
145
146   /**
147    * Returns the value of this header as an {@link HttpEntityTagsHeader}.
148    *
149    * @return The value of this header as an {@link HttpEntityTagsHeader}, never <jk>null</jk>.
150    */
151   public HttpEntityTagsHeader asEntityTagsHeader() {
152      return HttpEntityTagsHeader.of(getName(), getValue());
153   }
154
155   /**
156    * Returns the value of this header as an {@link HttpIntegerHeader}.
157    *
158    * @return The value of this header as an {@link HttpIntegerHeader}, never <jk>null</jk>.
159    */
160   public HttpIntegerHeader asIntegerHeader() {
161      return HttpIntegerHeader.of(getName(), getValue());
162   }
163
164   /**
165    * Returns the value of this header as an {@link HttpLongHeader}.
166    *
167    * @return The value of this header as an {@link HttpLongHeader}, never <jk>null</jk>.
168    */
169   public HttpLongHeader asLongHeader() {
170      return HttpLongHeader.of(getName(), getValue());
171   }
172
173   /**
174    * Returns the value of this header as an {@link HttpStringHeader}.
175    *
176    * @return The value of this header as an {@link HttpStringHeader}, never <jk>null</jk>.
177    */
178   public HttpStringHeader asStringHeader() {
179      return HttpStringHeader.of(getName(), getValue());
180   }
181
182   /**
183    * Returns the value of this header as an {@link HttpStringRangesHeader}.
184    *
185    * @return The value of this header as an {@link HttpStringRangesHeader}, never <jk>null</jk>.
186    */
187   public HttpStringRangesHeader asStringRangesHeader() {
188      return HttpStringRangesHeader.of(getName(), getValue());
189   }
190
191   /**
192    * Returns the value of this header as an {@link HttpUriHeader}.
193    *
194    * @return The value of this header as an {@link HttpUriHeader}, never <jk>null</jk>.
195    */
196   public HttpUriHeader asUriHeader() {
197      return HttpUriHeader.of(getName(), getValue());
198   }
199
200   @Override /* Overridden from RequestHttpPart */
201   public RequestHeader def(String def) {
202      super.def(def);
203      return this;
204   }
205
206   @Override /* Overridden from RequestHttpPart */
207   public RequestHeader parser(HttpPartParserSession value) {
208      super.parser(value);
209      return this;
210   }
211
212   @Override /* Overridden from RequestHttpPart */
213   public RequestHeader schema(HttpPartSchema value) {
214      super.schema(value);
215      return this;
216   }
217
218   @Override /* Overridden from Object */
219   public String toString() {
220      return getName() + ": " + getValue();
221   }
222}