OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [gnu/] [java/] [net/] [loader/] [FileURLLoader.java] - Blame information for rev 769

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 769 jeremybenn
/* FileURLLoader.java -- a URLLoader for file URLs
2
   Copyright (C) 2006 Free Software Foundation, Inc.
3
 
4
This file is part of GNU Classpath.
5
 
6
GNU Classpath is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
9
any later version.
10
 
11
GNU Classpath is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GNU Classpath; see the file COPYING.  If not, write to the
18
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301 USA.
20
 
21
Linking this library statically or dynamically with other modules is
22
making a combined work based on this library.  Thus, the terms and
23
conditions of the GNU General Public License cover the whole
24
combination.
25
 
26
As a special exception, the copyright holders of this library give you
27
permission to link this library with independent modules to produce an
28
executable, regardless of the license terms of these independent
29
modules, and to copy and distribute the resulting executable under
30
terms of your choice, provided that you also meet, for each linked
31
independent module, the terms and conditions of the license of that
32
module.  An independent module is a module which is not derived from
33
or based on this library.  If you modify this library, you may extend
34
this exception to your version of the library, but you are not
35
obligated to do so.  If you do not wish to do so, delete this
36
exception statement from your version. */
37
 
38
 
39
package gnu.java.net.loader;
40
 
41
 
42
import java.io.File;
43
import java.io.IOException;
44
import java.net.URL;
45
import java.net.URLClassLoader;
46
import java.net.URLStreamHandlerFactory;
47
import java.util.StringTokenizer;
48
 
49
/**
50
 * A <code>FileURLLoader</code> is a type of <code>URLLoader</code>
51
 * only loading from file url.
52
 */
53
public final class FileURLLoader extends URLLoader
54
{
55
  File dir; //the file for this file url
56
 
57
  public FileURLLoader(URLClassLoader classloader,
58
                       URLStreamHandlerCache cache,
59
                       URLStreamHandlerFactory factory,
60
                       URL url, URL absoluteUrl)
61
  {
62
    super(classloader, cache, factory, url, absoluteUrl);
63
    dir = new File(absoluteUrl.getFile());
64
  }
65
 
66
  /** get resource with the name "name" in the file url */
67
  public Resource getResource(String name)
68
  {
69
    try
70
      {
71
        // Make sure that all components in name are valid by walking through
72
        // them
73
        File file = walkPathComponents(name);
74
 
75
        if (file == null)
76
          return null;
77
 
78
        return new FileResource(this, file);
79
      }
80
    catch (IOException e)
81
      {
82
        // Fall through...
83
      }
84
    return null;
85
  }
86
 
87
  /**
88
   * Walk all path tokens and check them for validity. At no moment, we are
89
   * allowed to reach a directory located "above" the root directory, stored
90
   * in "dir" property. We are also not allowed to enter a non existing
91
   * directory or a non directory component (plain file, symbolic link, ...).
92
   * An empty or null path is valid. Pathnames components are separated by
93
   * <code>File.separatorChar</code>
94
   *
95
   * @param resourceFileName the name to be checked for validity.
96
   * @return the canonical file pointed by the resourceFileName or null if the
97
   *         walking failed
98
   * @throws IOException in case of issue when creating the canonical
99
   *           resulting file
100
   * @see File#separatorChar
101
   */
102
  private File walkPathComponents(String resourceFileName) throws IOException
103
  {
104
    StringTokenizer stringTokenizer = new StringTokenizer(resourceFileName, File.separator);
105
    File currentFile = dir;
106
    int tokenCount = stringTokenizer.countTokens();
107
 
108
    for (int i = 0; i < tokenCount - 1; i++)
109
      {
110
        String currentToken = stringTokenizer.nextToken();
111
 
112
        // If we are at the root directory and trying to go up, the walking is
113
        // finished with an error
114
        if ("..".equals(currentToken) && currentFile.equals(dir))
115
          return null;
116
 
117
        currentFile = new File(currentFile, currentToken);
118
 
119
        // If the current file doesn't exist or is not a directory, the walking is
120
        // finished with an error
121
        if (! (currentFile.exists() && currentFile.isDirectory()))
122
          return null;
123
 
124
      }
125
 
126
    // Treat the last token differently, if it exists, because it does not need
127
    // to be a directory
128
    if (tokenCount > 0)
129
      {
130
        String currentToken = stringTokenizer.nextToken();
131
 
132
        if ("..".equals(currentToken) && currentFile.equals(dir))
133
          return null;
134
 
135
        currentFile = new File(currentFile, currentToken);
136
 
137
        // If the current file doesn't exist, the walking is
138
        // finished with an error
139
        if (! currentFile.exists())
140
          return null;
141
    }
142
 
143
    return currentFile.getCanonicalFile();
144
  }
145
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.