001    /*
002     * Copyright 2004-2005 The Apache Software Foundation
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.apache.commons.net.ftp.parser;
017    
018    import java.text.ParseException;
019    
020    import org.apache.commons.net.ftp.FTPClientConfig;
021    import org.apache.commons.net.ftp.FTPFile;
022    
023    /**
024     * @version $Id: OS400FTPEntryParser.java 155429 2005-02-26 13:13:04Z dirkv $
025     */
026    
027    public class OS400FTPEntryParser extends ConfigurableFTPFileEntryParserImpl
028    {
029        private static final String DEFAULT_DATE_FORMAT 
030                    = "yy/MM/dd HH:mm:ss"; //01/11/09 12:30:24
031        
032    
033    
034            private static final String REGEX =
035            "(\\S+)\\s+"                // user
036            + "(\\d+)\\s+"              // size
037            + "(\\S+)\\s+(\\S+)\\s+"    // date stuff 
038            + "(\\*\\S+)\\s+"               // *STMF/*DIR
039            + "(\\S+/?)\\s*";               // filename
040    
041        
042        /**
043         * The default constructor for a OS400FTPEntryParser object.
044         *
045         * @exception IllegalArgumentException
046         * Thrown if the regular expression is unparseable.  Should not be seen
047         * under normal conditions.  It it is seen, this is a sign that
048         * <code>REGEX</code> is  not a valid regular expression.
049         */
050        public OS400FTPEntryParser()
051        {
052            this(null);
053        }
054    
055        /**
056         * This constructor allows the creation of an OS400FTPEntryParser object 
057         * with something other than the default configuration.
058         *
059         * @param config The {@link FTPClientConfig configuration} object used to 
060         * configure this parser.
061         * @exception IllegalArgumentException
062         * Thrown if the regular expression is unparseable.  Should not be seen
063         * under normal conditions.  It it is seen, this is a sign that
064         * <code>REGEX</code> is  not a valid regular expression.
065         * @since 1.4
066         */
067        public OS400FTPEntryParser(FTPClientConfig config)
068        {
069            super(REGEX);
070            configure(config);
071        }
072    
073    
074        public FTPFile parseFTPEntry(String entry)
075        {
076    
077            FTPFile file = new FTPFile();
078            file.setRawListing(entry);
079            int type;
080    
081            if (matches(entry))
082            {
083                String usr = group(1);
084                String filesize = group(2);
085                    String datestr = group(3)+" "+group(4);
086                String typeStr = group(5);
087                String name = group(6);
088                
089                try
090                {
091                    file.setTimestamp(super.parseTimestamp(datestr));
092                }
093                catch (ParseException e)
094                {
095                    return null;  // this is a parsing failure too.
096                }
097    
098    
099                if (typeStr.equalsIgnoreCase("*STMF"))
100                {
101                    type = FTPFile.FILE_TYPE;
102                }
103                else if (typeStr.equalsIgnoreCase("*DIR"))
104                {
105                    type = FTPFile.DIRECTORY_TYPE;
106                }
107                else
108                {
109                    type = FTPFile.UNKNOWN_TYPE;
110                }
111    
112                file.setType(type);
113    
114                file.setUser(usr);
115    
116                try
117                {
118                    file.setSize(Long.parseLong(filesize));
119                }
120                catch (NumberFormatException e)
121                {
122                    // intentionally do nothing
123                }
124    
125                if (name.endsWith("/"))
126                {
127                    name = name.substring(0, name.length() - 1);
128                }
129                int pos = name.lastIndexOf('/');
130                if (pos > -1)
131                {
132                    name = name.substring(pos + 1);
133                }
134    
135                file.setName(name);
136    
137                return file;
138            }
139            return null;
140        }
141    
142        /**
143         * Defines a default configuration to be used when this class is
144         * instantiated without a {@link  FTPClientConfig  FTPClientConfig}
145         * parameter being specified.
146         * @return the default configuration for this parser.
147         */
148        protected FTPClientConfig getDefaultConfiguration() {
149            return new FTPClientConfig(
150                    FTPClientConfig.SYST_OS400,
151                    DEFAULT_DATE_FORMAT,
152                    null, null, null, null);
153        }
154    
155    }