/* * Path.java February 2001 * * Copyright (C) 2001, Niall Gallagher <niallg@users.sf.net> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package org.simpleframework.http; /** * The <code>Path</code> represents the path part of a URI. This provides the * various components of the URI path to the user. The normalization of the path * is the conversion of the path given into it's actual path by removing the * references to the parent directories and to the current dir. * <p> * If the path that this represents is <code>/usr/bin/../etc/./README</code> * then the actual path, normalized, is <code>/usr/etc/README</code>. Once the * path has been normalized it is possible to acquire the segments as an array * of strings, which allows simple manipulation of the path. * * @author Niall Gallagher * * @see org.simpleframework.http.parse.PathParser */ public interface Path { /** * This will return the extension that the file name contains. For example a * file name <code>file.en_US.extension</code> will produce an extension of * <code>extension</code>. This will return null if the path contains no * file extension. * * @return this will return the extension this path contains */ String getExtension(); /** * This will return the full name of the file without the path. As regargs * the definition of the path in RFC 2396 the name would be considered the * last path segment. So if the path was <code>/usr/README</code> the name * is <code>README</code>. Also for directorys the name of the directory in * the last path segment is returned. This returns the name without any of * the path parameters. As RFC 2396 defines the path to have path parameters * after the path segments. * * @return this will return the name of the file in the path */ String getName(); /** * This will return the normalized path. The normalized path is the path * without any references to its parent or itself. So if the path to be * parsed is <code>/usr/../etc/./</code> the path is <code>/etc/</code>. If * the path that this represents is a path with an immediate back reference * then this will return null. This is the path with all its information * even the parameter information if it was defined in the path. * * @return this returns the normalize path without <code>../</code> or * <code>./</code> */ String getPath(); /** * This will return the normalized path from the specified path segment. * This allows various path parts to be acquired in an efficient means what * does not require copy operations of the use of <code>substring</code> * invocations. Of particular interest is the extraction of context based * paths. This is the path with all its information even the parameter * information if it was defined in the path. * * @param from * this is the segment offset to get the path for * * @return this returns the normalize path without <code>../</code> or * <code>./</code> */ String getPath(int from); /** * This will return the normalized path from the specified path segment. * This allows various path parts to be acquired in an efficient means what * does not require copy operations of the use of <code>substring</code> * invocations. Of particular interest is the extraction of context based * paths. This is the path with all its information even the parameter * information if it was defined in the path. * * @param from * this is the segment offset to get the path for * @param count * this is the number of path segments to include * * @return this returns the normalize path without <code>../</code> or * <code>./</code> */ String getPath(int from, int count); /** * This method is used to break the path into individual parts called * segments, see RFC 2396. This can be used as an easy way to compare paths * and to examine the directory tree that the path points to. For example, * if an path was broken from the string <code>/usr/bin/../etc</code> then * the segments returned would be <code>usr</code> and <code>etc</code> as * the path is normalized before the segments are extracted. * * @return return all the path segments within the directory */ String[] getSegments(); /** * This will return the highest directory that exists within the path. This * is used to that files within the same path can be acquired. An example of * that this would do given the path <code>/pub/./bin/README</code> would be * to return the highest directory path <code>/pub/bin/</code>. The "/" * character will allways be the last character in the path. * * @return this method will return the highest directory */ String getDirectory(); /** * This will return the path as it is relative to the issued path. This in * effect will chop the start of this path if it's start matches the highest * directory of the given path as of <code>getDirectory</code>. This is * useful if paths that are relative to a specific location are required. To * illustrate what this method will do the following example is provided. If * this object represented the path string * <code>/usr/share/rfc/rfc2396.txt</code> and the issued path was * <code>/usr/share/text.txt</code> then this will return the path string * <code>/rfc/rfc2396.txt</code>. * * @param path * the path prefix to acquire a relative path * * @return returns a path relative to the one it is given otherwize this * method will return null */ String getRelative(String path); /** * This will return the normalized path. The normalized path is the path * without any references to its parent or itself. So if the path to be * parsed is <code>/usr/../etc/./</code> the path is <code>/etc/</code>. If * the path that this represents is a path with an immediate back reference * then this will return null. This is the path with all its information * even the parameter information if it was defined in the path. * * @return this returns the normalize path without <code>../</code> or * <code>./</code> */ @Override String toString(); }