| /* |
| * Copyright 2005 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.jackrabbit.webdav; |
| |
| import org.apache.log4j.Logger; |
| import org.apache.jackrabbit.webdav.xml.XmlSerializable; |
| import org.apache.jackrabbit.webdav.xml.DomUtil; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Document; |
| |
| /** |
| * <code>Status</code> encapsulating the 'status' present in multistatus |
| * responses. |
| */ |
| public class Status implements DavConstants, XmlSerializable{ |
| |
| private static Logger log = Logger.getLogger(Status.class); |
| |
| private final String version; |
| private final int code; |
| private final String phrase; |
| |
| public Status(int code) { |
| version = "HTTP/1.1"; |
| this.code = code; |
| phrase = DavException.getStatusPhrase(code); |
| } |
| |
| public Status(String version, int code, String phrase) { |
| this.version = version; |
| this.code = code; |
| this.phrase = phrase; |
| } |
| |
| public int getStatusCode() { |
| return code; |
| } |
| |
| /** |
| * @see XmlSerializable#toXml(Document) |
| */ |
| public Element toXml(Document document) { |
| String statusLine = version + " " + code + " " + phrase; |
| Element e = DomUtil.createElement(document, XML_STATUS, NAMESPACE); |
| DomUtil.setText(e, statusLine); |
| return e; |
| } |
| |
| /** |
| * Parse the given status line and return a new <code>Status</code> object. |
| * |
| * @param statusLine |
| * @return a new <code>Status</code> |
| */ |
| public static Status parse(String statusLine) { |
| if (statusLine == null) { |
| throw new IllegalArgumentException("Unable to parse status line from null xml element."); |
| } |
| Status status; |
| |
| // code copied from org.apache.commons.httpclient.StatusLine |
| int length = statusLine.length(); |
| int at = 0; |
| int start = 0; |
| try { |
| while (Character.isWhitespace(statusLine.charAt(at))) { |
| ++at; |
| ++start; |
| } |
| if (!"HTTP".equals(statusLine.substring(at, at += 4))) { |
| log.warn("Status-Line '" + statusLine + "' does not start with HTTP"); |
| } |
| //handle the HTTP-Version |
| at = statusLine.indexOf(" ", at); |
| if (at <= 0) { |
| log.warn("Unable to parse HTTP-Version from the status line: '" + statusLine + "'"); |
| } |
| String version = (statusLine.substring(start, at)).toUpperCase(); |
| //advance through spaces |
| while (statusLine.charAt(at) == ' ') { |
| at++; |
| } |
| //handle the Status-Code |
| int code; |
| int to = statusLine.indexOf(" ", at); |
| if (to < 0) { |
| to = length; |
| } |
| try { |
| code = Integer.parseInt(statusLine.substring(at, to)); |
| } catch (NumberFormatException e) { |
| throw new IllegalArgumentException("Unable to parse status code from status line: '" + statusLine + "'"); |
| } |
| //handle the Reason-Phrase |
| String phrase = ""; |
| at = to + 1; |
| if (at < length) { |
| phrase = statusLine.substring(at).trim(); |
| } |
| |
| status = new Status(version, code, phrase); |
| |
| } catch (StringIndexOutOfBoundsException e) { |
| throw new IllegalArgumentException("Status-Line '" + statusLine + "' is not valid"); |
| } |
| return status; |
| } |
| } |