| Method from org.apache.naming.resources.FileDirContext Detail: |
public void bind(String name,
Object obj,
Attributes attrs) throws NamingException {
// 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);
}
Binds a name to an object, along with associated attributes. If attrs
is null, the resulting binding will have the attributes associated
with obj if obj is a DirContext, and no attributes otherwise. If attrs
is non-null, the resulting binding will have attrs as its attributes;
any attributes associated with obj are ignored. |
public DirContext createSubcontext(String name,
Attributes attrs) throws NamingException {
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);
}
Creates and binds a new context, along with associated attributes.
This method creates a new subcontext with the given name, binds it in
the target context (that named by all but terminal atomic component of
the name), and associates the supplied attributes with the newly
created object. All intermediate and target contexts must already
exist. If attrs is null, this method is equivalent to
Context.createSubcontext(). |
public void destroySubcontext(String name) throws NamingException {
unbind(name);
}
Destroys the named context and removes it from the namespace. Any
attributes associated with the name are also removed. Intermediate
contexts are not destroyed.
This method is idempotent. It succeeds even if the terminal atomic
name is not bound in the target context, but throws
NameNotFoundException if any of the intermediate contexts do not exist.
In a federated naming system, a context from one naming system may be
bound to a name in another. One can subsequently look up and perform
operations on the foreign context using a composite name. However, an
attempt destroy the context using this composite name will fail with
NotContextException, because the foreign context is not a "subcontext"
of the context in which it is bound. Instead, use unbind() to remove
the binding of the foreign context. Destroying the foreign context
requires that the destroySubcontext() be performed on a context from
the foreign context's "native" naming system. |
protected File file(String name) {
File file = new File(base, name);
if (file.exists() && file.canRead()) {
if (allowLinking)
return file;
// Check that this file belongs to our root path
String canPath = null;
try {
canPath = file.getCanonicalPath();
} catch (IOException e) {
}
if (canPath == null)
return null;
// Check to see if going outside of the web application root
if (!canPath.startsWith(absoluteBase)) {
return null;
}
// Case sensitivity check
if (caseSensitive) {
String fileAbsPath = file.getAbsolutePath();
if (fileAbsPath.endsWith("."))
fileAbsPath = fileAbsPath + "/";
String absPath = normalize(fileAbsPath);
if (canPath != null)
canPath = normalize(canPath);
if ((absoluteBase.length() < absPath.length())
&& (absoluteBase.length() < canPath.length())) {
absPath = absPath.substring(absoluteBase.length() + 1);
if ((canPath == null) || (absPath == null))
return null;
if (absPath.equals(""))
absPath = "/";
canPath = canPath.substring(absoluteBase.length() + 1);
if (canPath.equals(""))
canPath = "/";
if (!canPath.equals(absPath))
return null;
}
}
} else {
return null;
}
return file;
}
Return a File object representing the specified normalized
context-relative path if it exists and is readable. Otherwise,
return null. |
public boolean getAllowLinking() {
return allowLinking;
}
|
public Attributes getAttributes(String name,
String[] attrIds) throws NamingException {
// Building attribute list
File file = file(name);
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", name));
return new FileResourceAttributes(file);
}
Retrieves selected attributes associated with a named object.
See the class description regarding attribute models, attribute type
names, and operational attributes. |
public String getNameInNamespace() throws NamingException {
return docBase;
}
Retrieves the full name of this context within its own namespace.
Many naming services have a notion of a "full name" for objects in
their respective namespaces. For example, an LDAP entry has a
distinguished name, and a DNS record has a fully qualified name. This
method allows the client application to retrieve this name. The string
returned by this method is not a JNDI composite name and should not be
passed directly to context methods. In naming systems for which the
notion of full name does not make sense,
OperationNotSupportedException is thrown. |
public DirContext getSchema(String name) throws NamingException {
throw new OperationNotSupportedException();
}
Retrieves the schema associated with the named object. The schema
describes rules regarding the structure of the namespace and the
attributes stored within it. The schema specifies what types of
objects can be added to the directory and where they can be added;
what mandatory and optional attributes an object can have. The range
of support for schemas is directory-specific. |
public DirContext getSchemaClassDefinition(String name) throws NamingException {
throw new OperationNotSupportedException();
}
Retrieves a context containing the schema objects of the named
object's class definitions. |
public boolean isCaseSensitive() {
return caseSensitive;
}
|
public NamingEnumeration list(String name) throws NamingException {
File file = file(name);
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", name));
return new NamingContextEnumeration(list(file).iterator());
}
Enumerates the names bound in the named context, along with the class
names of objects bound to them. The contents of any subcontexts are
not included.
If a binding is added to or removed from this context, its effect on
an enumeration previously returned is undefined. |
protected ArrayList list(File file) {
ArrayList entries = new ArrayList();
if (!file.isDirectory())
return entries;
String[] names = file.list();
if (names==null) {
/* Some IO error occurred such as bad file permissions.
Prevent a NPE with Arrays.sort(names) */
log.warn(sm.getString("fileResources.listingNull",
file.getAbsolutePath()));
return entries;
}
Arrays.sort(names); // Sort alphabetically
if (names == null)
return entries;
NamingEntry entry = null;
for (int i = 0; i < names.length; i++) {
File currentFile = new File(file, names[i]);
Object object = null;
if (currentFile.isDirectory()) {
FileDirContext tempContext = new FileDirContext(env);
tempContext.setDocBase(file.getPath());
tempContext.setAllowLinking(getAllowLinking());
tempContext.setCaseSensitive(isCaseSensitive());
object = tempContext;
} else {
object = new FileResource(currentFile);
}
entry = new NamingEntry(names[i], object, NamingEntry.ENTRY);
entries.add(entry);
}
return entries;
}
List the resources which are members of a collection. |
public NamingEnumeration listBindings(String name) throws NamingException {
File file = file(name);
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", name));
return new NamingContextBindingsEnumeration(list(file).iterator(),
this);
}
Enumerates the names bound in the named context, along with the
objects bound to them. The contents of any subcontexts are not
included.
If a binding is added to or removed from this context, its effect on
an enumeration previously returned is undefined. |
public Object lookup(String name) throws NamingException {
Object result = null;
File file = file(name);
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", name));
if (file.isDirectory()) {
FileDirContext tempContext = new FileDirContext(env);
tempContext.setDocBase(file.getPath());
tempContext.setAllowLinking(getAllowLinking());
tempContext.setCaseSensitive(isCaseSensitive());
result = tempContext;
} else {
result = new FileResource(file);
}
return result;
}
Retrieves the named object. |
public Object lookupLink(String name) throws NamingException {
// Note : Links are not supported
return lookup(name);
}
Retrieves the named object, following links except for the terminal
atomic component of the name. If the object bound to name is not a
link, returns the object itself. |
public void modifyAttributes(String name,
ModificationItem[] mods) throws NamingException {
}
Modifies the attributes associated with a named object using an an
ordered list of modifications. The modifications are performed in the
order specified. Each modification specifies a modification operation
code and an attribute on which to operate. Where possible, the
modifications are performed atomically. |
public void modifyAttributes(String name,
int mod_op,
Attributes attrs) throws NamingException {
}
Modifies the attributes associated with a named object. The order of
the modifications is not specified. Where possible, the modifications
are performed atomically. |
protected String normalize(String path) {
String normalized = path;
// Normalize the slashes and add leading slash if necessary
if (File.separatorChar == '\\" && normalized.indexOf('\\") >= 0)
normalized = normalized.replace('\\", '/");
if (!normalized.startsWith("/"))
normalized = "/" + normalized;
// Resolve occurrences of "//" in the normalized path
while (true) {
int index = normalized.indexOf("//");
if (index < 0)
break;
normalized = normalized.substring(0, index) +
normalized.substring(index + 1);
}
// Resolve occurrences of "/./" in the normalized path
while (true) {
int index = normalized.indexOf("/./");
if (index < 0)
break;
normalized = normalized.substring(0, index) +
normalized.substring(index + 2);
}
// Resolve occurrences of "/../" in the normalized path
while (true) {
int index = normalized.indexOf("/../");
if (index < 0)
break;
if (index == 0)
return (null); // Trying to go outside our context
int index2 = normalized.lastIndexOf('/", index - 1);
normalized = normalized.substring(0, index2) +
normalized.substring(index + 3);
}
// Return the normalized path that we have completed
return (normalized);
}
Return a context-relative path, beginning with a "/", that represents
the canonical version of the specified path after ".." and "." elements
are resolved out. If the specified path attempts to go outside the
boundaries of the current context (i.e. too many ".." path elements
are present), return null instead. |
public void rebind(String name,
Object obj,
Attributes attrs) throws NamingException {
// 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 = null;
byte buffer[] = new byte[BUFFER_SIZE];
int len = -1;
try {
os = new FileOutputStream(file);
while (true) {
len = is.read(buffer);
if (len == -1)
break;
os.write(buffer, 0, len);
}
} finally {
if (os != null)
os.close();
is.close();
}
} catch (IOException e) {
throw new NamingException
(sm.getString("resources.bindFailed", e));
}
}
Binds a name to an object, along with associated attributes,
overwriting any existing binding. If attrs is null and obj is a
DirContext, the attributes from obj are used. If attrs is null and obj
is not a DirContext, any existing attributes associated with the object
already bound in the directory remain unchanged. If attrs is non-null,
any existing attributes associated with the object already bound in
the directory are removed and attrs is associated with the named
object. If obj is a DirContext and attrs is non-null, the attributes
of obj are ignored. |
public void release() {
super.release();
}
Release any resources allocated for this directory context. |
public void rename(String oldName,
String newName) throws NamingException {
File file = file(oldName);
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", oldName));
File newFile = new File(base, newName);
file.renameTo(newFile);
}
Binds a new name to the object bound to an old name, and unbinds the
old name. Both names are relative to this context. Any attributes
associated with the old name become associated with the new name.
Intermediate contexts of the old name are not changed. |
public NamingEnumeration search(String name,
Attributes matchingAttributes) throws NamingException {
return null;
}
Searches in a single context for objects that contain a specified set
of attributes. This method returns all the attributes of such objects.
It is equivalent to supplying null as the atributesToReturn parameter
to the method search(Name, Attributes, String[]). |
public NamingEnumeration search(String name,
Attributes matchingAttributes,
String[] attributesToReturn) throws NamingException {
return null;
}
Searches in a single context for objects that contain a specified set
of attributes, and retrieves selected attributes. The search is
performed using the default SearchControls settings. |
public NamingEnumeration search(String name,
String filter,
SearchControls cons) throws NamingException {
return null;
}
Searches in the named context or object for entries that satisfy the
given search filter. Performs the search as specified by the search
controls. |
public NamingEnumeration search(String name,
String filterExpr,
Object[] filterArgs,
SearchControls cons) throws NamingException {
return null;
}
Searches in the named context or object for entries that satisfy the
given search filter. Performs the search as specified by the search
controls. |
public void setAllowLinking(boolean allowLinking) {
this.allowLinking = allowLinking;
}
|
public void setCaseSensitive(boolean caseSensitive) {
this.caseSensitive = caseSensitive;
}
|
public void setDocBase(String docBase) {
// ------------------------------------------------------------- Properties
// Validate the format of the proposed document root
if (docBase == null)
throw new IllegalArgumentException
(sm.getString("resources.null"));
// Calculate a File object referencing this document base directory
base = new File(docBase);
try {
base = base.getCanonicalFile();
} catch (IOException e) {
// Ignore
}
// Validate that the document base is an existing directory
if (!base.exists() || !base.isDirectory() || !base.canRead())
throw new IllegalArgumentException
(sm.getString("fileResources.base", docBase));
this.absoluteBase = base.getAbsolutePath();
super.setDocBase(docBase);
}
|
public void unbind(String name) throws NamingException {
File file = file(name);
if (file == null)
throw new NamingException
(sm.getString("resources.notFound", name));
if (!file.delete())
throw new NamingException
(sm.getString("resources.unbindFailed", name));
}
Unbinds the named object. Removes the terminal atomic name in name
from the target context--that named by all but the terminal atomic
part of name.
This method is idempotent. It succeeds even if the terminal atomic
name is not bound in the target context, but throws
NameNotFoundException if any of the intermediate contexts do not exist. |