001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.vfs2.provider;
018    
019    import org.apache.commons.httpclient.URIException;
020    import org.apache.commons.httpclient.util.URIUtil;
021    import org.apache.commons.vfs2.FileName;
022    import org.apache.commons.vfs2.FileSystemException;
023    import org.apache.commons.vfs2.FileType;
024    
025    /**
026     * @author <a href="http://commons.apache.org/vfs/team-list.html">Commons VFS team</a>
027     */
028    public class URLFileName extends GenericFileName
029    {
030        private static final int BUFFSZ = 250;
031    
032        private final String queryString;
033    
034        public URLFileName(final String scheme,
035                           final String hostName,
036                           final int port,
037                           final int defaultPort,
038                           final String userName,
039                           final String password,
040                           final String path,
041                           final FileType type,
042                           final String queryString)
043        {
044            super(scheme, hostName, port, defaultPort, userName, password, path, type);
045            this.queryString = queryString;
046        }
047    
048        /**
049         * Get the query string.
050         *
051         * @return the query string part of the filename
052         */
053        public String getQueryString()
054        {
055            return queryString;
056        }
057    
058        /**
059         * Get the path and query string e.g. /path/servlet?param1=true.
060         *
061         * @return the path and its query string
062         */
063        public String getPathQuery()
064        {
065            StringBuilder sb = new StringBuilder(BUFFSZ);
066            sb.append(getPath());
067            sb.append("?");
068            sb.append(getQueryString());
069    
070            return sb.toString();
071        }
072    
073        /**
074         * Get the path encoded suitable for url like filesystem e.g. (http, webdav).
075         *
076         * @param charset the charset used for the path encoding
077         * @return The encoded path.
078         * @throws URIException If an error occurs encoding the URI.
079         * @throws FileSystemException If some other error occurs.
080         */
081        public String getPathQueryEncoded(String charset) throws URIException, FileSystemException
082        {
083            if (getQueryString() == null)
084            {
085                if (charset != null)
086                {
087                    return URIUtil.encodePath(getPathDecoded(), charset);
088                }
089                else
090                {
091                    return URIUtil.encodePath(getPathDecoded());
092                }
093            }
094    
095            StringBuilder sb = new StringBuilder(BUFFSZ);
096            if (charset != null)
097            {
098                sb.append(URIUtil.encodePath(getPathDecoded(), charset));
099            }
100            else
101            {
102                sb.append(URIUtil.encodePath(getPathDecoded()));
103            }
104            sb.append("?");
105            sb.append(getQueryString());
106            return sb.toString();
107        }
108    
109        /**
110         * Create a FileName.
111         * @param absPath The absolute path.
112         * @param type The FileType.
113         * @return The FileName
114         */
115        @Override
116        public FileName createName(final String absPath, FileType type)
117        {
118            return new URLFileName(getScheme(),
119                getHostName(),
120                getPort(),
121                getDefaultPort(),
122                getUserName(),
123                getPassword(),
124                absPath,
125                type,
126                getQueryString());
127        }
128    
129        /**
130         * Append query string to the uri.
131         *
132         * @return the uri
133         */
134        @Override
135        protected String createURI()
136        {
137            if (getQueryString() != null)
138            {
139                StringBuilder sb = new StringBuilder(BUFFSZ);
140                sb.append(super.createURI());
141                sb.append("?");
142                sb.append(getQueryString());
143    
144                return sb.toString();
145            }
146    
147            return super.createURI();
148        }
149    
150        /**
151         * Encode a URI.
152         * @param charset The character set.
153         * @return The encoded URI
154         * @throws FileSystemException if some other exception occurs.
155         * @throws URIException if an exception occurs encoding the URI.
156         */
157        public String getURIEncoded(String charset) throws FileSystemException, URIException
158        {
159            StringBuilder sb = new StringBuilder(BUFFSZ);
160            appendRootUri(sb, true);
161            sb.append(getPathQueryEncoded(charset));
162            return sb.toString();
163        }
164    }