1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.vfs2.provider;
18
19 import org.apache.commons.vfs2.FileName;
20 import org.apache.commons.vfs2.FileSystemException;
21 import org.apache.commons.vfs2.FileType;
22
23 /**
24 * Generic implementation for any URL based file system, without depending on a specific library.
25 * <p>
26 * Parses the URL into user/password/host/port/path/queryString.
27 * </p>
28 */
29 public class GenericURLFileNameParser extends HostFileNameParser {
30
31 /**
32 * Constructs a new instance.
33 *
34 * @param defaultPort The default port.
35 */
36 public GenericURLFileNameParser(final int defaultPort) {
37 super(defaultPort);
38 }
39
40 @Override
41 public boolean encodeCharacter(final char ch) {
42 return super.encodeCharacter(ch) || ch == '?';
43 }
44
45 @Override
46 public FileName parseUri(final VfsComponentContext context, final FileName base, final String fileName)
47 throws FileSystemException {
48 // FTP URI are generic URI (as per RFC 2396)
49 final StringBuilder name = new StringBuilder();
50
51 // Extract the scheme and authority parts
52 final Authority auth = extractToPath(context, fileName, name);
53
54 // Extract the queryString
55 final String queryString = UriParser.extractQueryString(name);
56
57 // Decode and normalise the file name
58 UriParser.canonicalizePath(name, 0, name.length(), this);
59 UriParser.fixSeparators(name);
60 final FileType fileType = UriParser.normalisePath(name);
61 final String path = name.toString();
62
63 return new GenericURLFileName(auth.getScheme(), auth.getHostName(), auth.getPort(), getDefaultPort(),
64 auth.getUserName(), auth.getPassword(), path, fileType, queryString);
65 }
66 }