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    }