    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
    018    package org.apache.commons.net.ftp.parser;
    019    import java.text.ParseException;
    020
    021    import org.apache.commons.net.ftp.FTPClientConfig;
    022    import org.apache.commons.net.ftp.FTPFile;
    023
    024    /**
    025     * Implementation of FTPFileEntryParser and FTPFileListParser for OS2 Systems.
    026     *
    027     * @author <a href="Winston.Ojeda@qg.com">Winston Ojeda</a>
    028     * @author <a href="mailto:scohen@apache.org">Steve Cohen</a>
    029     * @version $Id: OS2FTPEntryParser.java 1299238 2012-03-10 17:12:28Z sebb $
    030     * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
    031     */
    032    public class OS2FTPEntryParser extends ConfigurableFTPFileEntryParserImpl
    033
    034    {
    035
    036        private static final String DEFAULT_DATE_FORMAT
    037            = "MM-dd-yy HH:mm"; //11-09-01 12:30
    038        /**
    039         * this is the regular expression used by this parser.
    040         */
    041        private static final String REGEX =
    042            "\\s*([0-9]+)\\s*"
    043            + "(\\s+|[A-Z]+)\\s*"
    044            + "(DIR|\\s+)\\s*"
    045            + "(\\S+)\\s+(\\S+)\\s+" /* date stuff */
    046            + "(\\S.*)";
    047
    048        /**
    049         * The default constructor for a OS2FTPEntryParser object.
    050         *
    051         * @exception IllegalArgumentException
    052         * Thrown if the regular expression is unparseable.  Should not be seen
    053         * under normal conditions.  It it is seen, this is a sign that
    054         * <code>REGEX</code> is  not a valid regular expression.
    055         */
    056        public OS2FTPEntryParser()
    057        {
    058            this(null);
    059        }
    060
    061        /**
    062         * This constructor allows the creation of an OS2FTPEntryParser object
    063         * with something other than the default configuration.
    064         *
    065         * @param config The {@link FTPClientConfig configuration} object used to
    066         * configure this parser.
    067         * @exception IllegalArgumentException
    068         * Thrown if the regular expression is unparseable.  Should not be seen
    069         * under normal conditions.  It it is seen, this is a sign that
    070         * <code>REGEX</code> is  not a valid regular expression.
    071         * @since 1.4
    072         */
    073         public OS2FTPEntryParser(FTPClientConfig config)
    074        {
    075            super(REGEX);
    076            configure(config);
    077        }
    078
    079        /**
    080         * Parses a line of an OS2 FTP server file listing and converts it into a
    081         * usable format in the form of an <code> FTPFile </code> instance.  If the
    082         * file listing line doesn't describe a file, <code> null </code> is
    083         * returned, otherwise a <code> FTPFile </code> instance representing the
    084         * files in the directory is returned.
    085         * <p>
    086         * @param entry A line of text from the file listing
    087         * @return An FTPFile instance corresponding to the supplied entry
    088         */
    089        public FTPFile parseFTPEntry(String entry)
    090        {
    091
    092            FTPFile f = new FTPFile();
    093            if (matches(entry))
    094            {
    095                String size = group(1);
    096                String attrib = group(2);
    097                String dirString = group(3);
    098                String datestr = group(4)+" "+group(5);
    099                String name = group(6);
    100                try
    101                {
    102                    f.setTimestamp(super.parseTimestamp(datestr));
    103                }
    104                catch (ParseException e)
    105                {
    106                    // intentionally do nothing
    107                }
    108
    109
    110                //is it a DIR or a file
    111                if (dirString.trim().equals("DIR") || attrib.trim().equals("DIR"))
    112                {
    113                    f.setType(FTPFile.DIRECTORY_TYPE);
    114                }
    115                else
    116                {
    117                    f.setType(FTPFile.FILE_TYPE);
    118                }
    119
    120
    121                //set the name
    122                f.setName(name.trim());
    123
    124                //set the size
    125                f.setSize(Long.parseLong(size.trim()));
    126
    127                return (f);
    128            }
    129            return null;
    130
    131        }
    132
    133        /**
    134         * Defines a default configuration to be used when this class is
    135         * instantiated without a {@link  FTPClientConfig  FTPClientConfig}
    136         * parameter being specified.
    137         * @return the default configuration for this parser.
    138         */
    139        @Override
    140        protected FTPClientConfig getDefaultConfiguration() {
    141            return new FTPClientConfig(
    142                    FTPClientConfig.SYST_OS2,
    143                    DEFAULT_DATE_FORMAT,
    144                    null, null, null, null);
    145        }
    146
    147    }