You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2001/01/13 22:17:06 UTC
cvs commit: jakarta-tomcat-4.1/catalina/src/share/org/apache/naming/resources FileDirContext.java LocalStrings.properties
remm 01/01/13 13:17:06
Modified: catalina/src/share/org/apache/naming/resources
FileDirContext.java LocalStrings.properties
Log:
- Implement the last three missing calls in the FileDirContext.
- Fix a problem where a file was locked after doing a lookup. It now uses an
extended version of the resource class which only opens the stream to the
file when the stream is actually requested.
Revision Changes Path
1.4 +124 -26 jakarta-tomcat-4.1/catalina/src/share/org/apache/naming/resources/FileDirContext.java
Index: FileDirContext.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.1/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FileDirContext.java 2001/01/13 05:15:55 1.3
+++ FileDirContext.java 2001/01/13 21:17:05 1.4
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-tomcat-4.1/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v 1.3 2001/01/13 05:15:55 remm Exp $
- * $Revision: 1.3 $
- * $Date: 2001/01/13 05:15:55 $
+ * $Header: /home/cvs/jakarta-tomcat-4.1/catalina/src/share/org/apache/naming/resources/FileDirContext.java,v 1.4 2001/01/13 21:17:05 remm Exp $
+ * $Revision: 1.4 $
+ * $Date: 2001/01/13 21:17:05 $
*
* ====================================================================
*
@@ -82,6 +82,7 @@
import javax.naming.CompositeName;
import javax.naming.NameParser;
import javax.naming.OperationNotSupportedException;
+import javax.naming.NameAlreadyBoundException;
import javax.naming.directory.DirContext;
import javax.naming.directory.Attributes;
import javax.naming.directory.Attribute;
@@ -97,7 +98,7 @@
* Filesystem Directory Context implementation helper class.
*
* @author Remy Maucherat
- * @version $Revision: 1.3 $ $Date: 2001/01/13 05:15:55 $
+ * @version $Revision: 1.4 $ $Date: 2001/01/13 21:17:05 $
*/
public class FileDirContext extends BaseDirContext {
@@ -230,13 +231,7 @@
tempContext.setDocBase(file.getPath());
result = tempContext;
} else {
- try {
- InputStream is = new FileInputStream(file);
- result = new Resource(is);
- } catch (FileNotFoundException e) {
- throw new NamingException
- (sm.getString("resources.notFound", name));
- }
+ result = new FileResource(file);
}
return result;
@@ -262,12 +257,14 @@
throws NamingException {
File file = file(name);
-
+
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", name));
- file.delete();
+ if (!file.delete())
+ throw new NamingException
+ (sm.getString("resources.unbindFailed", name));
}
@@ -524,8 +521,16 @@
*/
public void bind(String name, Object obj, Attributes attrs)
throws NamingException {
- // No custom attributes
- // FIXME
+
+ // Note: No custom attributes allowed
+
+ File file = new File(base, name);
+ if (file.exists())
+ throw new NameAlreadyBoundException
+ (sm.getString("resources.alreadyBound", name));
+
+ rebind(name, obj, attrs);
+
}
@@ -549,8 +554,56 @@
*/
public void rebind(String name, Object obj, Attributes attrs)
throws NamingException {
- // No custom attributes
- // FIXME
+
+ // Note: No custom attributes allowed
+ // Check obj type
+
+ File file = new File(base, name);
+
+ InputStream is = null;
+ if (obj instanceof Resource) {
+ try {
+ is = ((Resource) obj).streamContent();
+ } catch (IOException e) {
+ }
+ } else if (obj instanceof InputStream) {
+ is = (InputStream) obj;
+ } else if (obj instanceof DirContext) {
+ if (file.exists()) {
+ if (!file.delete())
+ throw new NamingException
+ (sm.getString("resources.bindFailed", name));
+ }
+ if (!file.mkdir())
+ throw new NamingException
+ (sm.getString("resources.bindFailed", name));
+ }
+ if (is == null)
+ throw new NamingException
+ (sm.getString("resources.bindFailed", name));
+
+ // Open os
+
+ try {
+ FileOutputStream os = new FileOutputStream(file);
+ byte buffer[] = new byte[BUFFER_SIZE];
+ int len = -1;
+ try {
+ while (true) {
+ len = is.read(buffer);
+ if (len == -1)
+ break;
+ os.write(buffer, 0, len);
+ }
+ os.close();
+ } catch (IOException ex) {
+ os.close();
+ }
+ } catch (IOException e) {
+ throw new NamingException
+ (sm.getString("resources.bindFailed", e));
+ }
+
}
@@ -573,8 +626,16 @@
*/
public DirContext createSubcontext(String name, Attributes attrs)
throws NamingException {
- // FIXME
- return null;
+
+ File file = new File(base, name);
+ if (file.exists())
+ throw new NameAlreadyBoundException
+ (sm.getString("resources.alreadyBound", name));
+ if (!file.mkdir())
+ throw new NamingException
+ (sm.getString("resources.bindFailed", name));
+ return (DirContext) lookup(name);
+
}
@@ -796,13 +857,14 @@
} catch (IOException e) {
}
absPath = absPath.substring(absoluteBase.length());
+ if ((canPath == null) || (absPath == null))
+ return null;
if (absPath.equals(""))
absPath = "/";
canPath = canPath.substring(absoluteBase.length());
if (canPath.equals(""))
canPath = "/";
- if ((canPath == null) || (absPath == null)
- || (!canPath.equals(absPath)))
+ if (!canPath.equals(absPath))
return null;
}
} else {
@@ -834,11 +896,7 @@
tempContext.setDocBase(file.getPath());
object = tempContext;
} else {
- try {
- object = new Resource(new FileInputStream(currentFile));
- } catch (FileNotFoundException e) {
- continue;
- }
+ object = new FileResource(currentFile);
}
entry = new NamingEntry(names[i], object, NamingEntry.ENTRY);
entries.addElement(entry);
@@ -847,6 +905,46 @@
return entries;
+ }
+
+
+ // ----------------------------------------------- FileResource Inner Class
+
+
+ /**
+ * This specialized resource implementation avoids opening the IputStream
+ * to the file right away (which would put a lock on the file).
+ */
+ protected class FileResource extends Resource {
+
+
+ // -------------------------------------------------------- Constructor
+
+
+ public FileResource(File file) {
+ this.file = file;
+ }
+
+
+ // --------------------------------------------------- Member Variables
+
+
+ protected File file;
+
+
+ /**
+ * Content accessor.
+ *
+ * @return InputStream
+ */
+ public InputStream streamContent()
+ throws IOException {
+ if ((inputStream == null) && (binaryContent == null))
+ inputStream = new FileInputStream(file);
+ return super.streamContent();
+ }
+
+
}
1.3 +3 -0 jakarta-tomcat-4.1/catalina/src/share/org/apache/naming/resources/LocalStrings.properties
Index: LocalStrings.properties
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.1/catalina/src/share/org/apache/naming/resources/LocalStrings.properties,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- LocalStrings.properties 2001/01/13 05:17:04 1.2
+++ LocalStrings.properties 2001/01/13 21:17:06 1.3
@@ -7,6 +7,9 @@
resources.null=Document base cannot be null
resources.notFound=Resource {0} not found
resources.path=Context relative path {0} must start with '/'
+resources.alreadyBound=Name {0} is already bound in this Context
+resources.bindFailed=Bind failed: {0}
+resources.unbindFailed=Unbind failed: {0}
standardResources.alreadyStarted=Resources has already been started
standardResources.directory=File base {0} is not a directory
standardResources.exists=File base {0} does not exist