001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hdfs.web.resources;
019
020import java.util.Arrays;
021import java.util.Collections;
022import java.util.List;
023
024import javax.ws.rs.core.Response;
025
026
027/** Http operation parameter. */
028public abstract class HttpOpParam<E extends Enum<E> & HttpOpParam.Op>
029    extends EnumParam<E> {
030  /** Parameter name. */
031  public static final String NAME = "op";
032
033  /** Default parameter value. */
034  public static final String DEFAULT = NULL;
035
036  /** Http operation types */
037  public static enum Type {
038    GET, PUT, POST, DELETE;
039  }
040
041  /** Http operation interface. */
042  public static interface Op {
043    /** @return the Http operation type. */
044    public Type getType();
045
046    /** @return true if the operation cannot use a token */
047    public boolean getRequireAuth();
048    
049    /** @return true if the operation will do output. */
050    public boolean getDoOutput();
051
052    /** @return true if the operation will be redirected. */
053    public boolean getRedirect();
054
055    /** @return true the expected http response code. */
056    public int getExpectedHttpResponseCode();
057
058    /** @return a URI query string. */
059    public String toQueryString();
060  }
061
062  /** Expects HTTP response 307 "Temporary Redirect". */
063  public static class TemporaryRedirectOp implements Op {
064    static final TemporaryRedirectOp CREATE = new TemporaryRedirectOp(
065        PutOpParam.Op.CREATE);
066    static final TemporaryRedirectOp APPEND = new TemporaryRedirectOp(
067        PostOpParam.Op.APPEND);
068    static final TemporaryRedirectOp OPEN = new TemporaryRedirectOp(
069        GetOpParam.Op.OPEN);
070    static final TemporaryRedirectOp GETFILECHECKSUM = new TemporaryRedirectOp(
071        GetOpParam.Op.GETFILECHECKSUM);
072    
073    static final List<TemporaryRedirectOp> values
074        = Collections.unmodifiableList(Arrays.asList(CREATE, APPEND, OPEN,
075                                       GETFILECHECKSUM));
076
077    /** Get an object for the given op. */
078    public static TemporaryRedirectOp valueOf(final Op op) {
079      for(TemporaryRedirectOp t : values) {
080        if (op == t.op) {
081          return t;
082        }
083      }
084      throw new IllegalArgumentException(op + " not found.");
085    }
086
087    private final Op op;
088
089    private TemporaryRedirectOp(final Op op) {
090      this.op = op;
091    }
092
093    @Override
094    public Type getType() {
095      return op.getType();
096    }
097
098    @Override
099    public boolean getRequireAuth() {
100      return op.getRequireAuth();
101    }
102
103    @Override
104    public boolean getDoOutput() {
105      return false;
106    }
107
108    @Override
109    public boolean getRedirect() {
110      return false;
111    }
112
113    /** Override the original expected response with "Temporary Redirect". */
114    @Override
115    public int getExpectedHttpResponseCode() {
116      return Response.Status.TEMPORARY_REDIRECT.getStatusCode();
117    }
118
119    @Override
120    public String toQueryString() {
121      return op.toQueryString();
122    }
123  }
124
125  /** @return the parameter value as a string */
126  @Override
127  public String getValueString() {
128    return value.toString();
129  }
130
131  HttpOpParam(final Domain<E> domain, final E value) {
132    super(domain, value);
133  }
134}