001: /*
002: * Enhydra Java Application Server Project
003: *
004: * The contents of this file are subject to the Enhydra Public License
005: * Version 1.1 (the "License"); you may not use this file except in
006: * compliance with the License. You may obtain a copy of the License on
007: * the Enhydra web site ( http://www.enhydra.org/ ).
008: *
009: * Software distributed under the License is distributed on an "AS IS"
010: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
011: * the License for the specific terms governing rights and limitations
012: * under the License.
013: *
014: * The Initial Developer of the Enhydra Application Server is Lutris
015: * Technologies, Inc. The Enhydra Application Server and portions created
016: * by Lutris Technologies, Inc. are Copyright Lutris Technologies, Inc.
017: * All Rights Reserved.
018: *
019: * Contributor(s):
020: *
021: * $Id: LocalDirResource.java,v 1.2 2006-06-15 14:07:00 sinisa Exp $
022: */
023:
024: package com.lutris.classloader;
025:
026: // lutris packages
027: // v. strahinja, 24 sep 2002
028: import java.io.File;
029: import java.io.FileInputStream;
030: import java.io.FileNotFoundException;
031: import java.io.IOException;
032: import java.io.InputStream;
033:
034: import com.lutris.logging.LogChannel;
035: import com.lutris.util.FatalExceptionError;
036:
037: /**
038: * <P>A <CODE>Resource</CODE> that is a file on the local machine in
039: * a specified directory. The directory is represented by a
040: * <CODE>ClassPathEntry</CODE>, and the filename is specified by a String.
041: *
042: * @author Kristen Pol, Lutris Technologies
043: * @version $Revision : 1.1 $
044: * @see com.lutris.classloader.ClassPathEntry
045: * @see com.lutris.classloader.Resource
046: * @see java.io.File
047: */
048: public class LocalDirResource extends Resource {
049:
050: // private data members
051:
052: /** The file that represents this resource. */
053: private File file = null;
054:
055: // constructors
056:
057: /**
058: * Constructs local directory resource with specified name and location.
059: *
060: * @param name The file name of the resource.
061: * @param location The location of the resource.
062: * @param loadLogChannel The log channel for logging.
063: * @exception FileNotFoundException
064: * thrown if the desired file does not exist, does not have
065: * read permission or if the desired file exists above the
066: * relative root of the <code>LocalDirResource</code>.
067: * @see Resource
068: * @see ClassPathEntry
069: */
070: protected LocalDirResource(String name, ClassPathEntry location,
071: // v. strahinja, 24 sep 2002
072: LogChannel loadLogChannel)
073: // Logger loadLogger)
074: throws FileNotFoundException {
075: // v. strahinja, 24 sep 2002
076: super (name, location, loadLogChannel);
077: // super(name, location, loadLogger);
078: String locName = location.getName();
079: if (locName == null) {
080: throw new FileNotFoundException("The name for location, "
081: + location + ", is null");
082: }
083: file = new File(locName, name);
084: if (!file.exists() || !file.canRead()) {
085: File tmpFile = file;
086: file = null;
087: throw new FileNotFoundException("File, "
088: + tmpFile.getAbsolutePath()
089: + ", does not exist or does not "
090: + "have read permission");
091: }
092:
093: String path = null;
094: String parentPath = null;
095:
096: try {
097: parentPath = new File(locName).getCanonicalPath();
098: } catch (IOException e) {
099: file = null;
100: throw new FileNotFoundException("Classpath Directory "
101: + locName + " cannot be resolved: " + e.toString());
102: }
103:
104: try {
105: path = file.getCanonicalPath();
106: } catch (IOException e) {
107: File tmpFile = file;
108: file = null;
109: throw new FileNotFoundException("File "
110: + tmpFile.getAbsolutePath()
111: + " cannot be resolved: " + e.toString());
112: }
113:
114: if (path.startsWith(parentPath) == false) {
115: File tmpFile = file;
116: file = null;
117: throw new FileNotFoundException("File, " + tmpFile
118: + " does not live under " + locName);
119: }
120:
121: size = file.length();
122: lastModifiedTime = file.lastModified();
123: }
124:
125: // public methods
126:
127: /**
128: * Gets input stream representing resource.
129: *
130: * @return the input stream that represents the resource.
131: * @exception IOException if the input stream can not be constructed.
132: * @see InputStream
133: */
134: public InputStream getInputStream() throws IOException {
135: try {
136: return new FileInputStream(file);
137: } catch (FileNotFoundException e) {
138: throw new FatalExceptionError(e);
139: }
140: }
141:
142: /**
143: * Get current last-modification time of resource. This is the
144: * time on the disk file the resource is associated with.
145: *
146: * @return the last-modified time of the permanent copy of the resource
147: * in milliseconds.
148: */
149: public long getCurrentLastModifiedTime()
150: throws FileNotFoundException {
151: return file.lastModified();
152: }
153:
154: /**
155: * Get the file associate with this resource.
156: */
157: public File getFile() {
158: return file;
159: }
160: }
|