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.http.response;
018
019import static org.apache.juneau.http.response.BadRequest.*;
020
021import java.text.*;
022import java.util.*;
023
024import org.apache.http.*;
025import org.apache.http.Header;
026import org.apache.juneau.annotation.*;
027import org.apache.juneau.http.*;
028import org.apache.juneau.http.annotation.*;
029import org.apache.juneau.http.header.*;
030import org.apache.juneau.internal.*;
031
032/**
033 * Exception representing an HTTP 400 (Bad Request).
034 *
035 * <p>
036 * The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing).
037 *
038 * <h5 class='section'>See Also:</h5><ul>
039 *    <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/JuneauRestCommonBasics">juneau-rest-common Basics</a>
040 * </ul>
041 *
042 * @serial exclude
043 */
044@Response
045@StatusCode(STATUS_CODE)
046@Schema(description=REASON_PHRASE)
047public class BadRequest extends BasicHttpException {
048   private static final long serialVersionUID = 1L;
049
050   /** HTTP status code */
051   public static final int STATUS_CODE = 400;
052
053   /** Reason phrase */
054   public static final String REASON_PHRASE = "Bad Request";
055
056   /** Default status line */
057   private static final BasicStatusLine STATUS_LINE = BasicStatusLine.create(STATUS_CODE, REASON_PHRASE);
058
059   /** Reusable unmodifiable instance */
060   public static final BadRequest INSTANCE = new BadRequest().setUnmodifiable();
061
062   /**
063    * Constructor.
064    *
065    * @param cause The caused-by exception.  Can be <jk>null</jk>.
066    * @param msg The message.  Can be <jk>null</jk>.
067    * @param args The message arguments.
068    */
069   public BadRequest(Throwable cause, String msg, Object...args) {
070      super(STATUS_CODE, cause, msg, args);
071      setStatusLine(STATUS_LINE.copy());
072   }
073
074   /**
075    * Constructor.
076    */
077   public BadRequest() {
078      this((Throwable)null, REASON_PHRASE);
079   }
080
081   /**
082    * Constructor.
083    *
084    * @param msg The message.  Can be <jk>null</jk>.
085    * @param args Optional {@link MessageFormat}-style arguments in the message.
086    */
087   public BadRequest(String msg, Object...args) {
088      this((Throwable)null, msg, args);
089   }
090
091   /**
092    * Constructor.
093    *
094    * @param cause The cause.  Can be <jk>null</jk>.
095    */
096   public BadRequest(Throwable cause) {
097      this(cause, cause == null ? REASON_PHRASE : cause.getMessage());
098   }
099
100   /**
101    * Constructor.
102    *
103    * <p>
104    * This is the constructor used when parsing an HTTP response.
105    *
106    * @param response The HTTP response to copy from.  Must not be <jk>null</jk>.
107    * @throws AssertionError If HTTP response status code does not match what was expected.
108    */
109   public BadRequest(HttpResponse response) {
110      super(response);
111      assertStatusCode(response);
112   }
113
114   /**
115    * Copy constructor.
116    *
117    * @param copyFrom The bean to copy.
118    */
119   protected BadRequest(BadRequest copyFrom) {
120      super(copyFrom);
121   }
122
123   /**
124    * Creates a modifiable copy of this bean.
125    *
126    * @return A new modifiable bean.
127    */
128   public BadRequest copy() {
129      return new BadRequest(this);
130   }
131   @Override /* Overridden from BasicRuntimeException */
132   public BadRequest setMessage(String message, Object...args) {
133      super.setMessage(message, args);
134      return this;
135   }
136
137   @Override /* Overridden from BasicRuntimeException */
138   public BadRequest setUnmodifiable() {
139      super.setUnmodifiable();
140      return this;
141   }
142
143   @Override /* Overridden from BasicHttpException */
144   public BadRequest setHeader2(String name, Object value) {
145      super.setHeader2(name, value);
146      return this;
147   }
148
149   @Override /* Overridden from BasicHttpException */
150   public BadRequest setHeaders(HeaderList value) {
151      super.setHeaders(value);
152      return this;
153   }
154
155   @Override /* Overridden from BasicHttpException */
156   public BadRequest setHeaders2(Header...values) {
157      super.setHeaders2(values);
158      return this;
159   }
160
161   @Override /* Overridden from BasicHttpException */
162   public BadRequest setLocale2(Locale value) {
163      super.setLocale2(value);
164      return this;
165   }
166
167   @Override /* Overridden from BasicHttpException */
168   public BadRequest setProtocolVersion(ProtocolVersion value) {
169      super.setProtocolVersion(value);
170      return this;
171   }
172
173   @Override /* Overridden from BasicHttpException */
174   public BadRequest setReasonPhrase2(String value) {
175      super.setReasonPhrase2(value);
176      return this;
177   }
178
179   @Override /* Overridden from BasicHttpException */
180   public BadRequest setReasonPhraseCatalog(ReasonPhraseCatalog value) {
181      super.setReasonPhraseCatalog(value);
182      return this;
183   }
184
185   @Override /* Overridden from BasicHttpException */
186   public BadRequest setStatusCode2(int code) throws IllegalStateException{
187      super.setStatusCode2(code);
188      return this;
189   }
190
191   @Override /* Overridden from BasicHttpException */
192   public BadRequest setStatusLine(BasicStatusLine value) {
193      super.setStatusLine(value);
194      return this;
195   }
196}