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.fs.http.server;
019
020import org.apache.hadoop.fs.http.client.HttpFSFileSystem;
021import org.apache.hadoop.lib.wsrs.BooleanParam;
022import org.apache.hadoop.lib.wsrs.EnumParam;
023import org.apache.hadoop.lib.wsrs.LongParam;
024import org.apache.hadoop.lib.wsrs.ShortParam;
025import org.apache.hadoop.lib.wsrs.StringParam;
026import org.apache.hadoop.lib.wsrs.UserProvider;
027import org.slf4j.MDC;
028
029import java.util.regex.Pattern;
030
031/**
032 * HttpFS HTTP Parameters used by {@link HttpFSServer}.
033 */
034public class HttpFSParams {
035
036  /**
037   * To avoid instantiation.
038   */
039  private HttpFSParams() {
040  }
041
042  /**
043   * Class for access-time parameter.
044   */
045  public static class AccessTimeParam extends LongParam {
046
047    /**
048     * Parameter name.
049     */
050    public static final String NAME = HttpFSFileSystem.ACCESS_TIME_PARAM;
051
052    /**
053     * Default parameter value.
054     */
055    public static final String DEFAULT = "-1";
056
057    /**
058     * Constructor.
059     *
060     * @param str parameter value.
061     */
062    public AccessTimeParam(String str) {
063      super(NAME, str);
064    }
065  }
066
067  /**
068   * Class for block-size parameter.
069   */
070  public static class BlockSizeParam extends LongParam {
071
072    /**
073     * Parameter name.
074     */
075    public static final String NAME = HttpFSFileSystem.BLOCKSIZE_PARAM;
076
077    /**
078     * Default parameter value.
079     */
080    public static final String DEFAULT = "-1";
081
082    /**
083     * Constructor.
084     *
085     * @param str parameter value.
086     */
087    public BlockSizeParam(String str) {
088      super(NAME, str);
089    }
090  }
091
092  /**
093   * Class for data parameter.
094   */
095  public static class DataParam extends BooleanParam {
096
097    /**
098     * Parameter name.
099     */
100    public static final String NAME = "data";
101
102    /**
103     * Default parameter value.
104     */
105    public static final String DEFAULT = "false";
106
107    /**
108     * Constructor.
109     *
110     * @param str parameter value.
111     */
112    public DataParam(String str) {
113      super(NAME, str);
114    }
115  }
116
117  /**
118   * Class for DELETE operation parameter.
119   */
120  public static class DeleteOpParam extends EnumParam<HttpFSFileSystem.DeleteOpValues> {
121
122    /**
123     * Parameter name.
124     */
125    public static final String NAME = HttpFSFileSystem.OP_PARAM;
126
127    /**
128     * Constructor.
129     *
130     * @param str parameter value.
131     */
132    public DeleteOpParam(String str) {
133      super(NAME, str, HttpFSFileSystem.DeleteOpValues.class);
134    }
135  }
136
137  /**
138   * Class for delete's recursive parameter.
139   */
140  public static class DeleteRecursiveParam extends BooleanParam {
141
142    /**
143     * Parameter name.
144     */
145    public static final String NAME = HttpFSFileSystem.RECURSIVE_PARAM;
146
147    /**
148     * Default parameter value.
149     */
150    public static final String DEFAULT = "false";
151
152    /**
153     * Constructor.
154     *
155     * @param str parameter value.
156     */
157    public DeleteRecursiveParam(String str) {
158      super(NAME, str);
159    }
160  }
161
162  /**
163   * Class for do-as parameter.
164   */
165  public static class DoAsParam extends StringParam {
166
167    /**
168     * Parameter name.
169     */
170    public static final String NAME = HttpFSFileSystem.DO_AS_PARAM;
171
172    /**
173     * Default parameter value.
174     */
175    public static final String DEFAULT = "";
176
177    /**
178     * Constructor.
179     *
180     * @param str parameter value.
181     */
182    public DoAsParam(String str) {
183      super(NAME, str, UserProvider.USER_PATTERN);
184    }
185
186    /**
187     * Delegates to parent and then adds do-as user to
188     * MDC context for logging purposes.
189     *
190     * @param name parameter name.
191     * @param str parameter value.
192     *
193     * @return parsed parameter
194     */
195    @Override
196    public String parseParam(String name, String str) {
197      String doAs = super.parseParam(name, str);
198      MDC.put(NAME, (doAs != null) ? doAs : "-");
199      return doAs;
200    }
201  }
202
203  /**
204   * Class for filter parameter.
205   */
206  public static class FilterParam extends StringParam {
207
208    /**
209     * Parameter name.
210     */
211    public static final String NAME = "filter";
212
213    /**
214     * Default parameter value.
215     */
216    public static final String DEFAULT = "";
217
218    /**
219     * Constructor.
220     *
221     * @param expr parameter value.
222     */
223    public FilterParam(String expr) {
224      super(NAME, expr);
225    }
226
227  }
228
229  /**
230   * Class for path parameter.
231   */
232  public static class FsPathParam extends StringParam {
233
234    /**
235     * Constructor.
236     *
237     * @param path parameter value.
238     */
239    public FsPathParam(String path) {
240      super("path", path);
241    }
242
243    /**
244     * Makes the path absolute adding '/' to it.
245     * <p/>
246     * This is required because JAX-RS resolution of paths does not add
247     * the root '/'.
248     */
249    public void makeAbsolute() {
250      String path = value();
251      path = "/" + ((path != null) ? path : "");
252      setValue(path);
253    }
254
255  }
256
257  /**
258   * Class for GET operation parameter.
259   */
260  public static class GetOpParam extends EnumParam<HttpFSFileSystem.GetOpValues> {
261
262    /**
263     * Parameter name.
264     */
265    public static final String NAME = HttpFSFileSystem.OP_PARAM;
266
267    /**
268     * Constructor.
269     *
270     * @param str parameter value.
271     */
272    public GetOpParam(String str) {
273      super(NAME, str, HttpFSFileSystem.GetOpValues.class);
274    }
275  }
276
277  /**
278   * Class for group parameter.
279   */
280  public static class GroupParam extends StringParam {
281
282    /**
283     * Parameter name.
284     */
285    public static final String NAME = HttpFSFileSystem.GROUP_PARAM;
286
287    /**
288     * Default parameter value.
289     */
290    public static final String DEFAULT = "";
291
292    /**
293     * Constructor.
294     *
295     * @param str parameter value.
296     */
297    public GroupParam(String str) {
298      super(NAME, str, UserProvider.USER_PATTERN);
299    }
300
301  }
302
303  /**
304   * Class for len parameter.
305   */
306  public static class LenParam extends LongParam {
307
308    /**
309     * Parameter name.
310     */
311    public static final String NAME = "len";
312
313    /**
314     * Default parameter value.
315     */
316    public static final String DEFAULT = "-1";
317
318    /**
319     * Constructor.
320     *
321     * @param str parameter value.
322     */
323    public LenParam(String str) {
324      super(NAME, str);
325    }
326  }
327
328  /**
329   * Class for modified-time parameter.
330   */
331  public static class ModifiedTimeParam extends LongParam {
332
333    /**
334     * Parameter name.
335     */
336    public static final String NAME = HttpFSFileSystem.MODIFICATION_TIME_PARAM;
337
338    /**
339     * Default parameter value.
340     */
341    public static final String DEFAULT = "-1";
342
343    /**
344     * Constructor.
345     *
346     * @param str parameter value.
347     */
348    public ModifiedTimeParam(String str) {
349      super(NAME, str);
350    }
351  }
352
353  /**
354   * Class for offset parameter.
355   */
356  public static class OffsetParam extends LongParam {
357
358    /**
359     * Parameter name.
360     */
361    public static final String NAME = "offset";
362
363    /**
364     * Default parameter value.
365     */
366    public static final String DEFAULT = "0";
367
368    /**
369     * Constructor.
370     *
371     * @param str parameter value.
372     */
373    public OffsetParam(String str) {
374      super(NAME, str);
375    }
376  }
377
378  /**
379   * Class for overwrite parameter.
380   */
381  public static class OverwriteParam extends BooleanParam {
382
383    /**
384     * Parameter name.
385     */
386    public static final String NAME = HttpFSFileSystem.OVERWRITE_PARAM;
387
388    /**
389     * Default parameter value.
390     */
391    public static final String DEFAULT = "true";
392
393    /**
394     * Constructor.
395     *
396     * @param str parameter value.
397     */
398    public OverwriteParam(String str) {
399      super(NAME, str);
400    }
401  }
402
403  /**
404   * Class for owner parameter.
405   */
406  public static class OwnerParam extends StringParam {
407
408    /**
409     * Parameter name.
410     */
411    public static final String NAME = HttpFSFileSystem.OWNER_PARAM;
412
413    /**
414     * Default parameter value.
415     */
416    public static final String DEFAULT = "";
417
418    /**
419     * Constructor.
420     *
421     * @param str parameter value.
422     */
423    public OwnerParam(String str) {
424      super(NAME, str, UserProvider.USER_PATTERN);
425    }
426
427  }
428
429  /**
430   * Class for permission parameter.
431   */
432  public static class PermissionParam extends StringParam {
433
434    /**
435     * Parameter name.
436     */
437    public static final String NAME = HttpFSFileSystem.PERMISSION_PARAM;
438
439    /**
440     * Default parameter value.
441     */
442    public static final String DEFAULT = HttpFSFileSystem.DEFAULT_PERMISSION;
443
444
445    /**
446     * Symbolic Unix permissions regular expression pattern.
447     */
448    private static final Pattern PERMISSION_PATTERN =
449      Pattern.compile(DEFAULT + "|(-[-r][-w][-x][-r][-w][-x][-r][-w][-x])" + "|[0-7][0-7][0-7]");
450
451    /**
452     * Constructor.
453     *
454     * @param permission parameter value.
455     */
456    public PermissionParam(String permission) {
457      super(NAME, permission.toLowerCase(), PERMISSION_PATTERN);
458    }
459
460  }
461
462  /**
463   * Class for POST operation parameter.
464   */
465  public static class PostOpParam extends EnumParam<HttpFSFileSystem.PostOpValues> {
466
467    /**
468     * Parameter name.
469     */
470    public static final String NAME = HttpFSFileSystem.OP_PARAM;
471
472    /**
473     * Constructor.
474     *
475     * @param str parameter value.
476     */
477    public PostOpParam(String str) {
478      super(NAME, str, HttpFSFileSystem.PostOpValues.class);
479    }
480  }
481
482  /**
483   * Class for PUT operation parameter.
484   */
485  public static class PutOpParam extends EnumParam<HttpFSFileSystem.PutOpValues> {
486
487    /**
488     * Parameter name.
489     */
490    public static final String NAME = HttpFSFileSystem.OP_PARAM;
491
492    /**
493     * Constructor.
494     *
495     * @param str parameter value.
496     */
497    public PutOpParam(String str) {
498      super(NAME, str, HttpFSFileSystem.PutOpValues.class);
499    }
500  }
501
502  /**
503   * Class for replication parameter.
504   */
505  public static class ReplicationParam extends ShortParam {
506
507    /**
508     * Parameter name.
509     */
510    public static final String NAME = HttpFSFileSystem.REPLICATION_PARAM;
511
512    /**
513     * Default parameter value.
514     */
515    public static final String DEFAULT = "-1";
516
517    /**
518     * Constructor.
519     *
520     * @param str parameter value.
521     */
522    public ReplicationParam(String str) {
523      super(NAME, str);
524    }
525  }
526
527  /**
528   * Class for to-path parameter.
529   */
530  public static class ToPathParam extends StringParam {
531
532    /**
533     * Parameter name.
534     */
535    public static final String NAME = HttpFSFileSystem.DESTINATION_PARAM;
536
537    /**
538     * Default parameter value.
539     */
540    public static final String DEFAULT = "";
541
542    /**
543     * Constructor.
544     *
545     * @param path parameter value.
546     */
547    public ToPathParam(String path) {
548      super(NAME, path);
549    }
550  }
551}