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     */
018    package org.apache.hadoop.fs.http.server;
019    
020    import org.apache.hadoop.classification.InterfaceAudience;
021    import org.apache.hadoop.fs.XAttrCodec;
022    import org.apache.hadoop.fs.XAttrSetFlag;
023    import org.apache.hadoop.fs.http.client.HttpFSFileSystem;
024    import org.apache.hadoop.fs.http.client.HttpFSFileSystem.Operation;
025    import org.apache.hadoop.lib.wsrs.BooleanParam;
026    import org.apache.hadoop.lib.wsrs.EnumParam;
027    import org.apache.hadoop.lib.wsrs.EnumSetParam;
028    import org.apache.hadoop.lib.wsrs.LongParam;
029    import org.apache.hadoop.lib.wsrs.Param;
030    import org.apache.hadoop.lib.wsrs.ParametersProvider;
031    import org.apache.hadoop.lib.wsrs.ShortParam;
032    import org.apache.hadoop.lib.wsrs.StringParam;
033    
034    import javax.ws.rs.ext.Provider;
035    import java.util.HashMap;
036    import java.util.Map;
037    import java.util.regex.Pattern;
038    
039    import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_WEBHDFS_ACL_PERMISSION_PATTERN_DEFAULT;
040    
041    /**
042     * HttpFS ParametersProvider.
043     */
044    @Provider
045    @InterfaceAudience.Private
046    @SuppressWarnings("unchecked")
047    public class HttpFSParametersProvider extends ParametersProvider {
048    
049      private static final Map<Enum, Class<Param<?>>[]> PARAMS_DEF =
050        new HashMap<Enum, Class<Param<?>>[]>();
051    
052      static {
053        PARAMS_DEF.put(Operation.OPEN,
054            new Class[]{OffsetParam.class, LenParam.class});
055        PARAMS_DEF.put(Operation.GETFILESTATUS, new Class[]{});
056        PARAMS_DEF.put(Operation.LISTSTATUS, new Class[]{FilterParam.class});
057        PARAMS_DEF.put(Operation.GETHOMEDIRECTORY, new Class[]{});
058        PARAMS_DEF.put(Operation.GETCONTENTSUMMARY, new Class[]{});
059        PARAMS_DEF.put(Operation.GETFILECHECKSUM, new Class[]{});
060        PARAMS_DEF.put(Operation.GETFILEBLOCKLOCATIONS, new Class[]{});
061        PARAMS_DEF.put(Operation.GETACLSTATUS, new Class[]{});
062        PARAMS_DEF.put(Operation.INSTRUMENTATION, new Class[]{});
063        PARAMS_DEF.put(Operation.APPEND, new Class[]{DataParam.class});
064        PARAMS_DEF.put(Operation.CONCAT, new Class[]{SourcesParam.class});
065        PARAMS_DEF.put(Operation.CREATE,
066          new Class[]{PermissionParam.class, OverwriteParam.class,
067                      ReplicationParam.class, BlockSizeParam.class, DataParam.class});
068        PARAMS_DEF.put(Operation.MKDIRS, new Class[]{PermissionParam.class});
069        PARAMS_DEF.put(Operation.RENAME, new Class[]{DestinationParam.class});
070        PARAMS_DEF.put(Operation.SETOWNER,
071            new Class[]{OwnerParam.class, GroupParam.class});
072        PARAMS_DEF.put(Operation.SETPERMISSION, new Class[]{PermissionParam.class});
073        PARAMS_DEF.put(Operation.SETREPLICATION,
074            new Class[]{ReplicationParam.class});
075        PARAMS_DEF.put(Operation.SETTIMES,
076            new Class[]{ModifiedTimeParam.class, AccessTimeParam.class});
077        PARAMS_DEF.put(Operation.DELETE, new Class[]{RecursiveParam.class});
078        PARAMS_DEF.put(Operation.SETACL, new Class[]{AclPermissionParam.class});
079        PARAMS_DEF.put(Operation.REMOVEACL, new Class[]{});
080        PARAMS_DEF.put(Operation.MODIFYACLENTRIES,
081            new Class[]{AclPermissionParam.class});
082        PARAMS_DEF.put(Operation.REMOVEACLENTRIES,
083            new Class[]{AclPermissionParam.class});
084        PARAMS_DEF.put(Operation.REMOVEDEFAULTACL, new Class[]{});
085        PARAMS_DEF.put(Operation.SETXATTR,
086            new Class[]{XAttrNameParam.class, XAttrValueParam.class,
087                      XAttrSetFlagParam.class});
088        PARAMS_DEF.put(Operation.REMOVEXATTR, new Class[]{XAttrNameParam.class});
089        PARAMS_DEF.put(Operation.GETXATTRS, 
090            new Class[]{XAttrNameParam.class, XAttrEncodingParam.class});
091        PARAMS_DEF.put(Operation.LISTXATTRS, new Class[]{});
092      }
093    
094      public HttpFSParametersProvider() {
095        super(HttpFSFileSystem.OP_PARAM, HttpFSFileSystem.Operation.class,
096              PARAMS_DEF);
097      }
098    
099      /**
100       * Class for access-time parameter.
101       */
102      @InterfaceAudience.Private
103      public static class AccessTimeParam extends LongParam {
104    
105        /**
106         * Parameter name.
107         */
108        public static final String NAME = HttpFSFileSystem.ACCESS_TIME_PARAM;
109        /**
110         * Constructor.
111         */
112        public AccessTimeParam() {
113          super(NAME, -1l);
114        }
115      }
116    
117      /**
118       * Class for block-size parameter.
119       */
120      @InterfaceAudience.Private
121      public static class BlockSizeParam extends LongParam {
122    
123        /**
124         * Parameter name.
125         */
126        public static final String NAME = HttpFSFileSystem.BLOCKSIZE_PARAM;
127    
128        /**
129         * Constructor.
130         */
131        public BlockSizeParam() {
132          super(NAME, -1l);
133        }
134      }
135    
136      /**
137       * Class for data parameter.
138       */
139      @InterfaceAudience.Private
140      public static class DataParam extends BooleanParam {
141    
142        /**
143         * Parameter name.
144         */
145        public static final String NAME = "data";
146    
147        /**
148         * Constructor.
149         */
150        public DataParam() {
151          super(NAME, false);
152        }
153      }
154    
155      /**
156       * Class for operation parameter.
157       */
158      @InterfaceAudience.Private
159      public static class OperationParam extends EnumParam<HttpFSFileSystem.Operation> {
160    
161        /**
162         * Parameter name.
163         */
164        public static final String NAME = HttpFSFileSystem.OP_PARAM;
165        /**
166         * Constructor.
167         */
168        public OperationParam(String operation) {
169          super(NAME, HttpFSFileSystem.Operation.class,
170                HttpFSFileSystem.Operation.valueOf(operation.toUpperCase()));
171        }
172      }
173    
174      /**
175       * Class for delete's recursive parameter.
176       */
177      @InterfaceAudience.Private
178      public static class RecursiveParam extends BooleanParam {
179    
180        /**
181         * Parameter name.
182         */
183        public static final String NAME = HttpFSFileSystem.RECURSIVE_PARAM;
184    
185        /**
186         * Constructor.
187         */
188        public RecursiveParam() {
189          super(NAME, false);
190        }
191      }
192    
193      /**
194       * Class for filter parameter.
195       */
196      @InterfaceAudience.Private
197      public static class FilterParam extends StringParam {
198    
199        /**
200         * Parameter name.
201         */
202        public static final String NAME = "filter";
203    
204        /**
205         * Constructor.
206         */
207        public FilterParam() {
208          super(NAME, null);
209        }
210    
211      }
212    
213      /**
214       * Class for group parameter.
215       */
216      @InterfaceAudience.Private
217      public static class GroupParam extends StringParam {
218    
219        /**
220         * Parameter name.
221         */
222        public static final String NAME = HttpFSFileSystem.GROUP_PARAM;
223    
224        /**
225         * Constructor.
226         */
227        public GroupParam() {
228          super(NAME, null);
229        }
230    
231      }
232    
233      /**
234       * Class for len parameter.
235       */
236      @InterfaceAudience.Private
237      public static class LenParam extends LongParam {
238    
239        /**
240         * Parameter name.
241         */
242        public static final String NAME = "length";
243    
244        /**
245         * Constructor.
246         */
247        public LenParam() {
248          super(NAME, -1l);
249        }
250      }
251    
252      /**
253       * Class for modified-time parameter.
254       */
255      @InterfaceAudience.Private
256      public static class ModifiedTimeParam extends LongParam {
257    
258        /**
259         * Parameter name.
260         */
261        public static final String NAME = HttpFSFileSystem.MODIFICATION_TIME_PARAM;
262    
263        /**
264         * Constructor.
265         */
266        public ModifiedTimeParam() {
267          super(NAME, -1l);
268        }
269      }
270    
271      /**
272       * Class for offset parameter.
273       */
274      @InterfaceAudience.Private
275      public static class OffsetParam extends LongParam {
276    
277        /**
278         * Parameter name.
279         */
280        public static final String NAME = "offset";
281    
282        /**
283         * Constructor.
284         */
285        public OffsetParam() {
286          super(NAME, 0l);
287        }
288      }
289    
290      /**
291       * Class for overwrite parameter.
292       */
293      @InterfaceAudience.Private
294      public static class OverwriteParam extends BooleanParam {
295    
296        /**
297         * Parameter name.
298         */
299        public static final String NAME = HttpFSFileSystem.OVERWRITE_PARAM;
300    
301        /**
302         * Constructor.
303         */
304        public OverwriteParam() {
305          super(NAME, true);
306        }
307      }
308    
309      /**
310       * Class for owner parameter.
311       */
312      @InterfaceAudience.Private
313      public static class OwnerParam extends StringParam {
314    
315        /**
316         * Parameter name.
317         */
318        public static final String NAME = HttpFSFileSystem.OWNER_PARAM;
319    
320        /**
321         * Constructor.
322         */
323        public OwnerParam() {
324          super(NAME, null);
325        }
326    
327      }
328    
329      /**
330       * Class for permission parameter.
331       */
332      @InterfaceAudience.Private
333      public static class PermissionParam extends ShortParam {
334    
335        /**
336         * Parameter name.
337         */
338        public static final String NAME = HttpFSFileSystem.PERMISSION_PARAM;
339    
340    
341        /**
342         * Constructor.
343         */
344        public PermissionParam() {
345          super(NAME, HttpFSFileSystem.DEFAULT_PERMISSION, 8);
346        }
347    
348      }
349    
350      /**
351       * Class for AclPermission parameter.
352       */
353      @InterfaceAudience.Private
354      public static class AclPermissionParam extends StringParam {
355    
356        /**
357         * Parameter name.
358         */
359        public static final String NAME = HttpFSFileSystem.ACLSPEC_PARAM;
360    
361        /**
362         * Constructor.
363         */
364        public AclPermissionParam() {
365          super(NAME, HttpFSFileSystem.ACLSPEC_DEFAULT,
366                  Pattern.compile(DFS_WEBHDFS_ACL_PERMISSION_PATTERN_DEFAULT));
367        }
368      }
369    
370      /**
371       * Class for replication parameter.
372       */
373      @InterfaceAudience.Private
374      public static class ReplicationParam extends ShortParam {
375    
376        /**
377         * Parameter name.
378         */
379        public static final String NAME = HttpFSFileSystem.REPLICATION_PARAM;
380    
381        /**
382         * Constructor.
383         */
384        public ReplicationParam() {
385          super(NAME, (short) -1);
386        }
387      }
388    
389      /**
390       * Class for concat sources parameter.
391       */
392      @InterfaceAudience.Private
393      public static class SourcesParam extends StringParam {
394    
395        /**
396         * Parameter name.
397         */
398        public static final String NAME = HttpFSFileSystem.SOURCES_PARAM;
399    
400        /**
401         * Constructor.
402         */
403        public SourcesParam() {
404          super(NAME, null);
405        }
406      }
407    
408      /**
409       * Class for to-path parameter.
410       */
411      @InterfaceAudience.Private
412      public static class DestinationParam extends StringParam {
413    
414        /**
415         * Parameter name.
416         */
417        public static final String NAME = HttpFSFileSystem.DESTINATION_PARAM;
418    
419        /**
420         * Constructor.
421         */
422        public DestinationParam() {
423          super(NAME, null);
424        }
425      }
426      
427      /**
428       * Class for xattr parameter.
429       */
430      @InterfaceAudience.Private
431      public static class XAttrNameParam extends StringParam {
432        public static final String XATTR_NAME_REGX = 
433            "^(user\\.|trusted\\.|system\\.|security\\.).+";
434        /**
435         * Parameter name.
436         */
437        public static final String NAME = HttpFSFileSystem.XATTR_NAME_PARAM;
438        private static final Pattern pattern = Pattern.compile(XATTR_NAME_REGX);
439    
440        /**
441         * Constructor.
442         */
443        public XAttrNameParam() {
444          super(NAME, null, pattern);
445        }
446      }
447    
448      /**
449       * Class for xattr parameter.
450       */
451      @InterfaceAudience.Private
452      public static class XAttrValueParam extends StringParam {
453        /**
454         * Parameter name.
455         */
456        public static final String NAME = HttpFSFileSystem.XATTR_VALUE_PARAM;
457    
458        /**
459         * Constructor.
460         */
461        public XAttrValueParam() {
462          super(NAME, null);
463        }
464      }
465    
466      /**
467       * Class for xattr parameter.
468       */
469      @InterfaceAudience.Private
470      public static class XAttrSetFlagParam extends EnumSetParam<XAttrSetFlag> {
471        /**
472         * Parameter name.
473         */
474        public static final String NAME = HttpFSFileSystem.XATTR_SET_FLAG_PARAM;
475    
476        /**
477         * Constructor.
478         */
479        public XAttrSetFlagParam() {
480          super(NAME, XAttrSetFlag.class, null);
481        }
482      }
483    
484      /**
485       * Class for xattr parameter.
486       */
487      @InterfaceAudience.Private
488      public static class XAttrEncodingParam extends EnumParam<XAttrCodec> {
489        /**
490         * Parameter name.
491         */
492        public static final String NAME = HttpFSFileSystem.XATTR_ENCODING_PARAM;
493    
494        /**
495         * Constructor.
496         */
497        public XAttrEncodingParam() {
498          super(NAME, XAttrCodec.class, null);
499        }
500      }
501    }