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
018package org.apache.commons.net.ftp;
019import java.io.BufferedReader;
020import java.io.IOException;
021import java.util.List;
022
023/**
024 * FTPFileEntryParser defines the interface for parsing a single FTP file
025 * listing and converting that information into an
026 * {@link org.apache.commons.net.ftp.FTPFile} instance.
027 * Sometimes you will want to parse unusual listing formats, in which
028 * case you would create your own implementation of FTPFileEntryParser and
029 * if necessary, subclass FTPFile.
030 * <p>
031 * Here are some examples showing how to use one of the classes that
032 * implement this interface.
033 * <p>
034 *
035 * The first example uses the <code>FTPClient.listFiles()</code>
036 * API to pull the whole list from the subfolder <code>subfolder</code> in
037 * one call, attempting to automatically detect the parser type.  This
038 * method, without a parserKey parameter, indicates that autodection should
039 * be used.
040 *
041 * <pre>
042 *    FTPClient f=FTPClient();
043 *    f.connect(server);
044 *    f.login(username, password);
045 *    FTPFile[] files = f.listFiles("subfolder");
046 * </pre>
047 *
048 * The second example uses the <code>FTPClient.listFiles()</code>
049 * API to pull the whole list from the current working directory in one call,
050 * but specifying by classname the parser to be used.  For this particular
051 * parser class, this approach is necessary since there is no way to
052 * autodetect this server type.
053 *
054 * <pre>
055 *    FTPClient f=FTPClient();
056 *    f.connect(server);
057 *    f.login(username, password);
058 *    FTPFile[] files = f.listFiles(
059 *      "org.apache.commons.net.ftp.parser.EnterpriseUnixFTPFileEntryParser",
060 *      ".");
061 * </pre>
062 *
063 * The third example uses the <code>FTPClient.listFiles()</code>
064 * API to pull a single file listing in an arbitrary directory in one call,
065 * specifying by KEY the parser to be used, in this case, VMS.
066 *
067 * <pre>
068 *    FTPClient f=FTPClient();
069 *    f.connect(server);
070 *    f.login(username, password);
071 *    FTPFile[] files = f.listFiles("VMS", "subfolder/foo.java");
072 * </pre>
073 *
074 * For an alternative approach, see the {@link FTPListParseEngine} class
075 * which provides iterative access.
076 *
077 * @version $Id: FTPFileEntryParser.java 1747119 2016-06-07 02:22:24Z ggregory $
078 * @see org.apache.commons.net.ftp.FTPFile
079 * @see org.apache.commons.net.ftp.FTPClient#listFiles()
080 */
081public interface FTPFileEntryParser
082{
083    /**
084     * Parses a line of an FTP server file listing and converts it into a usable
085     * format in the form of an <code> FTPFile </code> instance.  If the
086     * file listing line doesn't describe a file, <code> null </code> should be
087     * returned, otherwise a <code> FTPFile </code> instance representing the
088     * files in the directory is returned.
089     *
090     * @param listEntry A line of text from the file listing
091     * @return An FTPFile instance corresponding to the supplied entry
092     */
093    FTPFile parseFTPEntry(String listEntry);
094
095    /**
096     * Reads the next entry using the supplied BufferedReader object up to
097     * whatever delemits one entry from the next.  Implementors must define
098     * this for the particular ftp system being parsed.  In many but not all
099     * cases, this can be defined simply by calling BufferedReader.readLine().
100     *
101     * @param reader The BufferedReader object from which entries are to be
102     * read.
103     *
104     * @return A string representing the next ftp entry or null if none found.
105     * @throws IOException thrown on any IO Error reading from the reader.
106     */
107    String readNextEntry(BufferedReader reader) throws IOException;
108
109
110    /**
111     * This method is a hook for those implementors (such as
112     * VMSVersioningFTPEntryParser, and possibly others) which need to
113     * perform some action upon the FTPFileList after it has been created
114     * from the server stream, but before any clients see the list.
115     *
116     * The default implementation can be a no-op.
117     *
118     * @param original Original list after it has been created from the server stream
119     *
120     * @return Original list as processed by this method.
121     */
122    List<String> preParse(List<String> original);
123
124
125}
126
127
128/* Emacs configuration
129 * Local variables:        **
130 * mode:             java  **
131 * c-basic-offset:   4     **
132 * indent-tabs-mode: nil   **
133 * End:                    **
134 */