Author: rgoers
Date: Thu Nov 25 21:31:30 2010
New Revision: 1039191
URL: http://svn.apache.org/viewvc?rev=1039191&view=rev
Log:
Workaround for VFS-245 - equals(), hashcode() and compareTo() will return the
same results regardless of the FileType changing
Modified:
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileName.java
commons/proper/vfs/trunk/src/changes/changes.xml
Modified:
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileName.java
URL:
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileName.java?rev=1039191&r1=1039190&r2=1039191&view=diff
==============================================================================
---
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileName.java
(original)
+++
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/AbstractFileName.java
Thu Nov 25 21:31:30 2010
@@ -42,8 +42,7 @@ public abstract class AbstractFileName i
private String extension;
private String decodedAbsPath;
- private boolean calculateHashCode = true;
- private int calculatedHashCode;
+ private String key = null;
public AbstractFileName(final String scheme, final String absPath,
FileType type)
{
@@ -67,35 +66,27 @@ public abstract class AbstractFileName i
}
}
- /**
- * Returns the hashcode for this name.
- * @return The hashCode.
- */
@Override
- public int hashCode()
+ public boolean equals(Object o)
{
- if (calculateHashCode)
+ if (this == o)
{
- calculatedHashCode = getRootURI().hashCode() ^
getPath().hashCode();
- calculateHashCode = false;
+ return true;
+ }
+ if (o == null || getClass() != o.getClass())
+ {
+ return false;
}
- return calculatedHashCode;
+
+ AbstractFileName that = (AbstractFileName) o;
+
+ return (getKey().equals(that.getKey()));
}
- /**
- * Determines if this object is equal to another.
- * @param obj The object to compare.
- * @return true if equal, false if not.
- */
@Override
- public boolean equals(final Object obj)
+ public int hashCode()
{
- if (!(obj instanceof AbstractFileName))
- {
- return false;
- }
- final AbstractFileName name = (AbstractFileName) obj;
- return getRootURI().equals(name.getRootURI()) &&
getPath().equals(name.getPath());
+ return getKey().hashCode();
}
/**
@@ -107,21 +98,7 @@ public abstract class AbstractFileName i
public int compareTo(FileName obj)
{
final AbstractFileName name = (AbstractFileName) obj;
- int ret = getRootURI().compareTo(name.getRootURI());
- if (ret != 0)
- {
- return ret;
- }
-
- // return absPath.compareTo(name.absPath);
- try
- {
- return getPathDecoded().compareTo(name.getPathDecoded());
- }
- catch (FileSystemException e)
- {
- throw new RuntimeException(e.getMessage());
- }
+ return getKey().compareTo(name.getKey());
}
/**
@@ -270,12 +247,40 @@ public abstract class AbstractFileName i
protected String createURI()
{
+ return createURI(false, true);
+ }
+
+ /**
+ * Create a path that does not use the FileType since that field is not
immutable.
+ * @return The key.
+ */
+ private String getKey()
+ {
+ if (key == null)
+ {
+ key = createURI(true, true);
+ }
+ return key;
+ }
+
+ /**
+ * returns a "friendly path", this is a path without a password.
+ * @return The "friendly" URI.
+ */
+ public String getFriendlyURI()
+ {
+ return createURI(false, false);
+ }
+
+ private String createURI(boolean useAbsolutePath, boolean usePassword)
+ {
final StringBuilder buffer = new StringBuilder();
- appendRootUri(buffer, true);
- buffer.append(getPath());
+ appendRootUri(buffer, usePassword);
+ buffer.append(useAbsolutePath ? absPath : getPath());
return buffer.toString();
}
+
/**
* Converts a file name to a relative name, relative to this file name.
* @param name The FileName.
@@ -539,16 +544,4 @@ public abstract class AbstractFileName i
return true;
}
-
- /**
- * returns a "friendly path", this is a path without a password.
- * @return The "friendly" URI.
- */
- public String getFriendlyURI()
- {
- final StringBuilder buffer = new StringBuilder();
- appendRootUri(buffer, false);
- buffer.append(getPath());
- return buffer.toString();
- }
}
Modified: commons/proper/vfs/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1039191&r1=1039190&r2=1039191&view=diff
==============================================================================
--- commons/proper/vfs/trunk/src/changes/changes.xml (original)
+++ commons/proper/vfs/trunk/src/changes/changes.xml Thu Nov 25 21:31:30 2010
@@ -23,6 +23,10 @@
<body>
<release version="2.0" date="in SVN" description="">
+ <action issue="VFS-245" dev="rgoers" type="fix">
+ AbstractFileName is not immutable as it should be. equals(),
hashcode() and compareTo() have been modified
+ to return the same results regardless of whether the FileType is
changed.
+ </action>
<action issue="VFS-334" dev="sebb" type="fix" due-to="sebb">
DefaultFileSystemConfigBuilder.getConfigClass() returns
DefaultFileSystemConfigBuilder.class which is not a FileSystem
</action>