View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.net.ftp.parser;
19  
20  import java.text.ParseException;
21  
22  import org.apache.commons.net.ftp.FTPClientConfig;
23  import org.apache.commons.net.ftp.FTPFile;
24  
25  /**
26   * Implementation of FTPFileEntryParser and FTPFileListParser for Netware Systems. Note that some proprietary extensions for Novell-specific operations
27   * are not supported. See <a href="http://www.novell.com/documentation/nw65/index.html?page=/documentation/nw65/ftp_enu/data/fbhbgcfa.html">
28   * http://www.novell.com/documentation/nw65/index.html?page=/documentation/nw65/ftp_enu/data/fbhbgcfa.html</a> for more details.
29   *
30   * @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for usage instructions)
31   * @since 1.5
32   */
33  public class NetwareFTPEntryParser extends ConfigurableFTPFileEntryParserImpl {
34  
35      /**
36       * Default date format is e.g. Feb 22 2006
37       */
38      private static final String DEFAULT_DATE_FORMAT = "MMM dd yyyy";
39  
40      /**
41       * Default recent date format is e.g. Feb 22 17:32
42       */
43      private static final String DEFAULT_RECENT_DATE_FORMAT = "MMM dd HH:mm";
44  
45      /**
46       * this is the regular expression used by this parser. Example: d [-W---F--] SCION_VOL2 512 Apr 13 23:12 VOL2
47       */
48      private static final String REGEX = "(d|-){1}\\s+" // Directory/file flag
49              + "\\[([-A-Z]+)\\]\\s+" // Attributes RWCEAFMS or -
50              + "(\\S+)\\s+" + "(\\d+)\\s+" // Owner and size
51              + "(\\S+\\s+\\S+\\s+((\\d+:\\d+)|(\\d{4})))" // Long/short date format
52              + "\\s+(.*)"; // Filename (incl. spaces)
53  
54      /**
55       * The default constructor for a NetwareFTPEntryParser object.
56       *
57       * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not be seen under normal conditions. If it is seen, this is a
58       *                                  sign that <code>REGEX</code> is not a valid regular expression.
59       */
60      public NetwareFTPEntryParser() {
61          this(null);
62      }
63  
64      /**
65       * This constructor allows the creation of an NetwareFTPEntryParser object with something other than the default configuration.
66       *
67       * @param config The {@link FTPClientConfig configuration} object used to configure this parser.
68       * @throws IllegalArgumentException Thrown if the regular expression is unparseable. Should not be seen under normal conditions. If it is seen, this is a
69       *                                  sign that <code>REGEX</code> is not a valid regular expression.
70       * @since 1.4
71       */
72      public NetwareFTPEntryParser(final FTPClientConfig config) {
73          super(REGEX);
74          configure(config);
75      }
76  
77      /**
78       * Defines a default configuration to be used when this class is instantiated without a {@link FTPClientConfig FTPClientConfig} parameter being specified.
79       *
80       * @return the default configuration for this parser.
81       */
82      @Override
83      protected FTPClientConfig getDefaultConfiguration() {
84          return new FTPClientConfig(FTPClientConfig.SYST_NETWARE, DEFAULT_DATE_FORMAT, DEFAULT_RECENT_DATE_FORMAT);
85      }
86  
87      /**
88       * Parses a line of an NetwareFTP server file listing and converts it into a usable format in the form of an <code> FTPFile </code> instance. If the file
89       * listing line doesn't describe a file, <code> null </code> is returned, otherwise a <code> FTPFile </code> instance representing the files in the
90       * directory is returned.
91       * <p>
92       * Netware file permissions are in the following format: RWCEAFMS, and are explained as follows:
93       * <ul>
94       * <li><b>S</b> - Supervisor; All rights.
95       * <li><b>R</b> - Read; Right to open and read or execute.
96       * <li><b>W</b> - Write; Right to open and modify.
97       * <li><b>C</b> - Create; Right to create; when assigned to a file, allows a deleted file to be recovered.
98       * <li><b>E</b> - Erase; Right to delete.
99       * <li><b>M</b> - Modify; Right to rename a file and to change attributes.
100      * <li><b>F</b> - File Scan; Right to see directory or file listings.
101      * <li><b>A</b> - Access Control; Right to modify trustee assignments and the Inherited Rights Mask.
102      * </ul>
103      *
104      * See <a href="http://www.novell.com/documentation/nfap10/index.html?page=/documentation/nfap10/nfaubook/data/abxraws.html"> here</a> for more details
105      *
106      * @param entry A line of text from the file listing
107      * @return An FTPFile instance corresponding to the supplied entry
108      */
109     @Override
110     public FTPFile parseFTPEntry(final String entry) {
111 
112         final FTPFile f = new FTPFile();
113         if (matches(entry)) {
114             final String dirString = group(1);
115             final String attrib = group(2);
116             final String user = group(3);
117             final String size = group(4);
118             final String datestr = group(5);
119             final String name = group(9);
120 
121             try {
122                 f.setTimestamp(super.parseTimestamp(datestr));
123             } catch (final ParseException e) {
124                 // intentionally do nothing
125             }
126 
127             // is it a DIR or a file
128             if (dirString.trim().equals("d")) {
129                 f.setType(FTPFile.DIRECTORY_TYPE);
130             } else // Should be "-"
131             {
132                 f.setType(FTPFile.FILE_TYPE);
133             }
134 
135             f.setUser(user);
136 
137             // set the name
138             f.setName(name.trim());
139 
140             // set the size
141             f.setSize(Long.parseLong(size.trim()));
142 
143             // Now set the permissions (or at least a subset thereof - full permissions would probably require
144             // subclassing FTPFile and adding extra metainformation there)
145             if (attrib.indexOf('R') != -1) {
146                 f.setPermission(FTPFile.USER_ACCESS, FTPFile.READ_PERMISSION, true);
147             }
148             if (attrib.indexOf('W') != -1) {
149                 f.setPermission(FTPFile.USER_ACCESS, FTPFile.WRITE_PERMISSION, true);
150             }
151 
152             return f;
153         }
154         return null;
155 
156     }
157 
158 }