Home | History | Annotate | Download | only in ftp
      1 /*
      2  * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 package sun.net.ftp;
     26 
     27 import java.util.Date;
     28 import java.util.HashMap;
     29 
     30 /**
     31  * A {@code FtpDirEntry} is a class agregating all the information that the FTP client
     32  * can gather from the server by doing a {@code LST} (or {@code NLST}) command and
     33  * parsing the output. It will typically contain the name, type, size, last modification
     34  * time, owner and group of the file, although some of these could be unavailable
     35  * due to specific FTP server limitations.
     36  *
     37  * @see sun.net.ftp.FtpDirParser
     38  * @since 1.7
     39  */
     40 public class FtpDirEntry {
     41 
     42     public enum Type {
     43 
     44         FILE, DIR, PDIR, CDIR, LINK
     45     };
     46 
     47     public enum Permission {
     48 
     49         USER(0), GROUP(1), OTHERS(2);
     50         int value;
     51 
     52         Permission(int v) {
     53             value = v;
     54         }
     55     };
     56     private final String name;
     57     private String user = null;
     58     private String group = null;
     59     private long size = -1;
     60     private java.util.Date created = null;
     61     private java.util.Date lastModified = null;
     62     private Type type = Type.FILE;
     63     private boolean[][] permissions = null;
     64     private HashMap<String, String> facts = new HashMap<String, String>();
     65 
     66     private FtpDirEntry() {
     67         name = null;
     68     }
     69 
     70     /**
     71      * Creates an FtpDirEntry instance with only the name being set.
     72      *
     73      * @param name The name of the file
     74      */
     75     public FtpDirEntry(String name) {
     76         this.name = name;
     77     }
     78 
     79     /**
     80      * Returns the name of the remote file.
     81      *
     82      * @return a {@code String} containing the name of the remote file.
     83      */
     84     public String getName() {
     85         return name;
     86     }
     87 
     88     /**
     89      * Returns the user name of the owner of the file as returned by the FTP
     90      * server, if provided. This could be a name or a user id (number).
     91      *
     92      * @return a {@code String} containing the user name or
     93      *         {@code null} if that information is not available.
     94      */
     95     public String getUser() {
     96         return user;
     97     }
     98 
     99     /**
    100      * Sets the user name of the owner of the file. Intended mostly to be
    101      * used from inside a {@link java.net.FtpDirParser} implementation.
    102      *
    103      * @param user The user name of the owner of the file, or {@code null}
    104      * if that information is not available.
    105      * @return this FtpDirEntry
    106      */
    107     public FtpDirEntry setUser(String user) {
    108         this.user = user;
    109         return this;
    110     }
    111 
    112     /**
    113      * Returns the group name of the file as returned by the FTP
    114      * server, if provided. This could be a name or a group id (number).
    115      *
    116      * @return a {@code String} containing the group name or
    117      *         {@code null} if that information is not available.
    118      */
    119     public String getGroup() {
    120         return group;
    121     }
    122 
    123     /**
    124      * Sets the name of the group to which the file belong. Intended mostly to be
    125      * used from inside a {@link java.net.FtpDirParser} implementation.
    126      *
    127      * @param group The name of the group to which the file belong, or {@code null}
    128      * if that information is not available.
    129      * @return this FtpDirEntry
    130      */
    131     public FtpDirEntry setGroup(String group) {
    132         this.group = group;
    133         return this;
    134     }
    135 
    136     /**
    137      * Returns the size of the remote file as it was returned by the FTP
    138      * server, if provided.
    139      *
    140      * @return the size of the file or -1 if that information is not available.
    141      */
    142     public long getSize() {
    143         return size;
    144     }
    145 
    146     /**
    147      * Sets the size of that file. Intended mostly to be used from inside an
    148      * {@link java.net.FtpDirParser} implementation.
    149      *
    150      * @param size The size, in bytes, of that file. or -1 if unknown.
    151      * @return this FtpDirEntry
    152      */
    153     public FtpDirEntry setSize(long size) {
    154         this.size = size;
    155         return this;
    156     }
    157 
    158     /**
    159      * Returns the type of the remote file as it was returned by the FTP
    160      * server, if provided.
    161      * It returns a FtpDirEntry.Type enum and the values can be:
    162      * - FtpDirEntry.Type.FILE for a normal file
    163      * - FtpDirEntry.Type.DIR for a directory
    164      * - FtpDirEntry.Type.LINK for a symbolic link
    165      *
    166      * @return a {@code FtpDirEntry.Type} describing the type of the file
    167      *         or {@code null} if that information is not available.
    168      */
    169     public Type getType() {
    170         return type;
    171     }
    172 
    173     /**
    174      * Sets the type of the file. Intended mostly to be used from inside an
    175      * {@link java.net.FtpDirParser} implementation.
    176      *
    177      * @param type the type of this file or {@code null} if that information
    178      * is not available.
    179      * @return this FtpDirEntry
    180      */
    181     public FtpDirEntry setType(Type type) {
    182         this.type = type;
    183         return this;
    184     }
    185 
    186     /**
    187      * Returns the last modification time of the remote file as it was returned
    188      * by the FTP server, if provided, {@code null} otherwise.
    189      *
    190      * @return a <code>Date</code> representing the last time the file was
    191      *         modified on the server, or {@code null} if that
    192      *         information is not available.
    193      */
    194     public java.util.Date getLastModified() {
    195         return this.lastModified;
    196     }
    197 
    198     /**
    199      * Sets the last modification time of the file. Intended mostly to be used
    200      * from inside an {@link java.net.FtpDirParser} implementation.
    201      *
    202      * @param lastModified The Date representing the last modification time, or
    203      * {@code null} if that information is not available.
    204      * @return this FtpDirEntry
    205      */
    206     public FtpDirEntry setLastModified(Date lastModified) {
    207         this.lastModified = lastModified;
    208         return this;
    209     }
    210 
    211     /**
    212      * Returns whether read access is granted for a specific permission.
    213      *
    214      * @param p the Permission (user, group, others) to check.
    215      * @return {@code true} if read access is granted.
    216      */
    217     public boolean canRead(Permission p) {
    218         if (permissions != null) {
    219             return permissions[p.value][0];
    220         }
    221         return false;
    222     }
    223 
    224     /**
    225      * Returns whether write access is granted for a specific permission.
    226      *
    227      * @param p the Permission (user, group, others) to check.
    228      * @return {@code true} if write access is granted.
    229      */
    230     public boolean canWrite(Permission p) {
    231         if (permissions != null) {
    232             return permissions[p.value][1];
    233         }
    234         return false;
    235     }
    236 
    237     /**
    238      * Returns whether execute access is granted for a specific permission.
    239      *
    240      * @param p the Permission (user, group, others) to check.
    241      * @return {@code true} if execute access is granted.
    242      */
    243     public boolean canExexcute(Permission p) {
    244         if (permissions != null) {
    245             return permissions[p.value][2];
    246         }
    247         return false;
    248     }
    249 
    250     /**
    251      * Sets the permissions for that file. Intended mostly to be used
    252      * from inside an {@link java.net.FtpDirParser} implementation.
    253      * The permissions array is a 3x3 {@code boolean} array, the first index being
    254      * the User, group or owner (0, 1 and 2 respectively) while the second
    255      * index is read, write or execute (0, 1 and 2 respectively again).
    256      * <p>E.G.: {@code permissions[1][2]} is the group/execute permission.</p>
    257      *
    258      * @param permissions a 3x3 {@code boolean} array
    259      * @return this {@code FtpDirEntry}
    260      */
    261     public FtpDirEntry setPermissions(boolean[][] permissions) {
    262         this.permissions = permissions;
    263         return this;
    264     }
    265 
    266     /**
    267      * Adds a 'fact', as defined in RFC 3659, to the list of facts of this file.
    268      * Intended mostly to be used from inside a {@link java.net.FtpDirParser}
    269      * implementation.
    270      *
    271      * @param fact the name of the fact (e.g. "Media-Type"). It is not case-sensitive.
    272      * @param value the value associated with this fact.
    273      * @return this {@code FtpDirEntry}
    274      */
    275     public FtpDirEntry addFact(String fact, String value) {
    276         facts.put(fact.toLowerCase(), value);
    277         return this;
    278     }
    279 
    280     /**
    281      * Returns the requested 'fact', as defined in RFC 3659, if available.
    282      *
    283      * @param fact The name of the fact *e.g. "Media-Type"). It is not case sensitive.
    284      * @return The value of the fact or, {@code null} if that fact wasn't
    285      * provided by the server.
    286      */
    287     public String getFact(String fact) {
    288         return facts.get(fact.toLowerCase());
    289     }
    290 
    291     /**
    292      * Returns the creation time of the file, when provided by the server.
    293      *
    294      * @return The Date representing the creation time, or {@code null}
    295      * if the server didn't provide that information.
    296      */
    297     public Date getCreated() {
    298         return created;
    299     }
    300 
    301     /**
    302      * Sets the creation time for that file. Intended mostly to be used from
    303      * inside a {@link java.net.FtpDirParser} implementation.
    304      *
    305      * @param created the Date representing the creation time for that file, or
    306      * {@code null} if that information is not available.
    307      * @return this FtpDirEntry
    308      */
    309     public FtpDirEntry setCreated(Date created) {
    310         this.created = created;
    311         return this;
    312     }
    313 
    314     /**
    315      * Returns a string representation of the object.
    316      * The {@code toString} method for class {@code FtpDirEntry}
    317      * returns a string consisting of the name of the file, followed by its
    318      * type between brackets, followed by the user and group between
    319      * parenthesis, then size between '{', and, finally, the lastModified of last
    320      * modification if it's available.
    321      *
    322      * @return  a string representation of the object.
    323      */
    324     @Override
    325     public String toString() {
    326         if (lastModified == null) {
    327             return name + " [" + type + "] (" + user + " / " + group + ") " + size;
    328         }
    329         return name + " [" + type + "] (" + user + " / " + group + ") {" + size + "} " + java.text.DateFormat.getDateInstance().format(lastModified);
    330     }
    331 }
    332