View Javadoc

    1   // ========================================================================
    2   // Copyright 1996-2005 Mort Bay Consulting Pty. Ltd.
    3   // ------------------------------------------------------------------------
    4   // Licensed under the Apache License, Version 2.0 (the "License");
    5   // you may not use this file except in compliance with the License.
    6   // You may obtain a copy of the License at
    7   // http://www.apache.org/licenses/LICENSE-2.0
    8   // Unless required by applicable law or agreed to in writing, software
    9   // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  // ========================================================================
    14  package org.mortbay.resource;
    15
    16  import java.io.File;
    17  import java.io.IOException;
    18  import java.io.InputStream;
    19  import java.io.OutputStream;
    20  import java.net.MalformedURLException;
    21  import java.net.URL;
    22  import java.net.URLConnection;
    23  import java.security.Permission;
    24
    25  import org.mortbay.log.Log;
    26  import org.mortbay.util.URIUtil;
    27
    28  /* ------------------------------------------------------------ */
    29  /** Abstract resource class.
    30   *
    31   * @author Nuno Pregui�a
    32   * @author Greg Wilkins (gregw)
    33   */
    34  public class URLResource extends Resource
    35  {
    36
    37
    38      protected URL _url;
    39      protected String _urlString;
    40      protected transient URLConnection _connection;
    41      protected transient InputStream _in=null;
    42      transient boolean _useCaches = Resource.__defaultUseCaches;
    43
    44      /* ------------------------------------------------------------ */
    45      protected URLResource(URL url, URLConnection connection)
    46      {
    47          _url = url;
    48          _urlString=_url.toString();
    49          _connection=connection;
    50      }
    51
    52      protected URLResource (URL url, URLConnection connection, boolean useCaches)
    53      {
    54          this (url, connection);
    55          _useCaches = useCaches;
    56      }
    57
    58      /* ------------------------------------------------------------ */
    59      protected synchronized boolean checkConnection()
    60      {
    61          if (_connection==null)
    62          {
    63              try{
    64                  _connection=_url.openConnection();
    65                  _connection.setUseCaches(_useCaches);
    66              }
    67              catch(IOException e)
    68              {
    69                  Log.ignore(e);
    70              }
    71          }
    72          return _connection!=null;
    73      }
    74
    75      /* ------------------------------------------------------------ */
    76      /** Release any resources held by the resource.
    77       */
    78      public synchronized void release()
    79      {
    80          if (_in!=null)
    81          {
    82              try{_in.close();}catch(IOException e){Log.ignore(e);}
    83              _in=null;
    84          }
    85
    86          if (_connection!=null)
    87              _connection=null;
    88      }
    89
    90      /* ------------------------------------------------------------ */
    91      /**
    92       * Returns true if the respresened resource exists.
    93       */
    94      public boolean exists()
    95      {
    96          try
    97          {
    98              synchronized(this)
    99              {
    100                 if (checkConnection() && _in==null )
    101                     _in = _connection.getInputStream();
    102             }
    103         }
    104         catch (IOException e)
    105         {
    106             Log.ignore(e);
    107         }
    108         return _in!=null;
    109     }
    110
    111     /* ------------------------------------------------------------ */
    112     /**
    113      * Returns true if the respresenetd resource is a container/directory.
    114      * If the resource is not a file, resources ending with "/" are
    115      * considered directories.
    116      */
    117     public boolean isDirectory()
    118     {
    119         return exists() && _url.toString().endsWith("/");
    120     }
    121
    122
    123     /* ------------------------------------------------------------ */
    124     /**
    125      * Returns the last modified time
    126      */
    127     public long lastModified()
    128     {
    129         if (checkConnection())
    130             return _connection.getLastModified();
    131         return -1;
    132     }
    133
    134
    135     /* ------------------------------------------------------------ */
    136     /**
    137      * Return the length of the resource
    138      */
    139     public long length()
    140     {
    141         if (checkConnection())
    142             return _connection.getContentLength();
    143         return -1;
    144     }
    145
    146     /* ------------------------------------------------------------ */
    147     /**
    148      * Returns an URL representing the given resource
    149      */
    150     public URL getURL()
    151     {
    152         return _url;
    153     }
    154
    155     /* ------------------------------------------------------------ */
    156     /**
    157      * Returns an File representing the given resource or NULL if this
    158      * is not possible.
    159      */
    160     public File getFile()
    161         throws IOException
    162     {
    163         // Try the permission hack
    164         if (checkConnection())
    165         {
    166             Permission perm = _connection.getPermission();
    167             if (perm instanceof java.io.FilePermission)
    168                 return new File(perm.getName());
    169         }
    170
    171         // Try the URL file arg
    172         try {return new File(_url.getFile());}
    173         catch(Exception e) {Log.ignore(e);}
    174
    175         // Don't know the file
    176         return null;
    177     }
    178
    179     /* ------------------------------------------------------------ */
    180     /**
    181      * Returns the name of the resource
    182      */
    183     public String getName()
    184     {
    185         return _url.toExternalForm();
    186     }
    187
    188     /* ------------------------------------------------------------ */
    189     /**
    190      * Returns an input stream to the resource
    191      */
    192     public synchronized InputStream getInputStream()
    193         throws java.io.IOException
    194     {
    195         if (!checkConnection())
    196             throw new IOException( "Invalid resource");
    197
    198         try
    199         {
    200             if( _in != null)
    201             {
    202                 InputStream in = _in;
    203                 _in=null;
    204                 return in;
    205             }
    206             return _connection.getInputStream();
    207         }
    208         finally
    209         {
    210             _connection=null;
    211         }
    212     }
    213
    214
    215     /* ------------------------------------------------------------ */
    216     /**
    217      * Returns an output stream to the resource
    218      */
    219     public OutputStream getOutputStream()
    220         throws java.io.IOException, SecurityException
    221     {
    222         throw new IOException( "Output not supported");
    223     }
    224
    225     /* ------------------------------------------------------------ */
    226     /**
    227      * Deletes the given resource
    228      */
    229     public boolean delete()
    230         throws SecurityException
    231     {
    232         throw new SecurityException( "Delete not supported");
    233     }
    234
    235     /* ------------------------------------------------------------ */
    236     /**
    237      * Rename the given resource
    238      */
    239     public boolean renameTo( Resource dest)
    240         throws SecurityException
    241     {
    242         throw new SecurityException( "RenameTo not supported");
    243     }
    244
    245     /* ------------------------------------------------------------ */
    246     /**
    247      * Returns a list of resource names contained in the given resource
    248      */
    249     public String[] list()
    250     {
    251         return null;
    252     }
    253
    254     /* ------------------------------------------------------------ */
    255     /**
    256      * Returns the resource contained inside the current resource with the
    257      * given name
    258      */
    259     public Resource addPath(String path)
    260         throws IOException,MalformedURLException
    261     {
    262         if (path==null)
    263             return null;
    264
    265         path = URIUtil.canonicalPath(path);
    266
    267         return newResource(URIUtil.addPaths(_url.toExternalForm(),path));
    268     }
    269
    270     /* ------------------------------------------------------------ */
    271     public String toString()
    272     {
    273         return _urlString;
    274     }
    275
    276     /* ------------------------------------------------------------ */
    277     public int hashCode()
    278     {
    279         return _url.hashCode();
    280     }
    281
    282     /* ------------------------------------------------------------ */
    283     public boolean equals( Object o)
    284     {
    285         return o instanceof URLResource &&
    286             _url.equals(((URLResource)o)._url);
    287     }
    288
    289     public boolean getUseCaches ()
    290     {
    291         return _useCaches;
    292     }
    293 }