diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-10-19 22:46:30 -0400 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-10-19 22:46:30 -0400 |
commit | 4a19d6a3afb37e789a273d746cd59bb6d42839b8 (patch) | |
tree | e7bf01d7985b76d51652dd62a59419a160c759ec | |
parent | 163db155413b82da5bdc1c72e761f2785c97a3b2 (diff) | |
parent | 4030ad60f305d1f23e9b681dca7a181ab4f09276 (diff) | |
download | libcore-4a19d6a3afb37e789a273d746cd59bb6d42839b8.zip libcore-4a19d6a3afb37e789a273d746cd59bb6d42839b8.tar.gz libcore-4a19d6a3afb37e789a273d746cd59bb6d42839b8.tar.bz2 |
Merge change Ice8c6c56
* changes:
Removing caching of file canonical path caching, and fixing NIO tests.
6 files changed, 20 insertions, 425 deletions
diff --git a/luni/src/main/java/java/io/File.java b/luni/src/main/java/java/io/File.java index cde9fcc..521623d 100644 --- a/luni/src/main/java/java/io/File.java +++ b/luni/src/main/java/java/io/File.java @@ -25,7 +25,6 @@ import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; -import org.apache.harmony.luni.internal.io.FileCanonPathCache; import org.apache.harmony.luni.util.DeleteOnExit; import org.apache.harmony.luni.util.Msg; import org.apache.harmony.luni.util.PriviAction; @@ -497,11 +496,15 @@ public class File implements Serializable, Comparable<File> { public String getCanonicalPath() throws IOException { byte[] result = properPath(false); String absPath = Util.toUTF8String(result); - String canonPath = FileCanonPathCache.get(absPath); - if (canonPath != null) { - return canonPath; - } + // BEGIN android-removed + // caching the canonical path is completely bogus + // String canonPath = FileCanonPathCache.get(absPath); + // if (canonPath != null) { + // return canonPath; + // } + // END android-removed + if(separatorChar == '/') { // resolve the full path first result = resolveLink(result, result.length, false); @@ -573,9 +576,13 @@ public class File implements Serializable, Comparable<File> { newResult[newLength] = 0; newResult = getCanonImpl(newResult); newLength = newResult.length; - canonPath = Util.toUTF8String(newResult, 0, newLength); - FileCanonPathCache.put(absPath, canonPath); - return canonPath; + + // BEGIN android-changed + // caching the canonical path is completely bogus + return Util.toUTF8String(newResult, 0, newLength); + // FileCanonPathCache.put(absPath, canonPath); + // return canonPath; + // END android-changed } /* diff --git a/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java b/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java deleted file mode 100644 index c1ffef9..0000000 --- a/luni/src/main/java/org/apache/harmony/luni/internal/io/FileCanonPathCache.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.harmony.luni.internal.io; - -import java.util.HashMap; -import java.util.LinkedList; - -/** - * A simple cache implementation for file's canonical path. The cache has fixed - * size <code> CACHE_SIZE </code> and cached elements would be expired. If - * <code>put<code> method is invoked when cache is full, the oldest element will be removed. - * - */ -public class FileCanonPathCache { - - static private class CacheElement { - String canonicalPath; - - long timestamp; - - public CacheElement(String path) { - this.canonicalPath = path; - this.timestamp = System.currentTimeMillis(); - } - } - - /** - * Max elements could be hold in the cache. - */ - public static final int CACHE_SIZE = 256; - - private static HashMap<String, CacheElement> cache = new HashMap<String, CacheElement>( - CACHE_SIZE); - - /** - * FIFO queue for tracking age of elements. - */ - private static LinkedList<String> list = new LinkedList<String>(); - - private static Object lock = new Object(); - - /** - * Expired time. - */ - private static long timeout = 600000; - - /** - * Retrieve element from cache. - * - * @param path - * absolute path. - * @return canonical path of <code>path</code> if it's in cache. - * - */ - public static String get(String path) { - CacheElement element = null; - synchronized (lock) { - element = cache.get(path); - } - - if (element == null) { - return null; - } - - long time = System.currentTimeMillis(); - if (time - element.timestamp > timeout) { - // remove all elements older than this one - synchronized (lock) { - if (cache.get(path) != null) { - String oldest = null; - do { - oldest = list.removeFirst(); - cache.remove(path); - } while (!path.equals(oldest)); - } - } - return null; - } - - return element.canonicalPath; - } - - /** - * Put element to cache. - * - * @param path - * absolute path. - * @param canonicalPath - * the canonical path of <code>path</code>. - */ - public static void put(String path, String canonicalPath) { - CacheElement element = new CacheElement(canonicalPath); - synchronized (lock) { - if (cache.size() >= CACHE_SIZE) { - // cache is full - String oldest = list.removeFirst(); - cache.remove(oldest); - } - cache.put(path, element); - list.addLast(path); - } - } - - /** - * Remove all elements from cache. - */ - public static void clear() { - synchronized (lock) { - cache.clear(); - list.clear(); - } - } - - public static long getTimeout() { - return timeout; - } - - public static void setTimeout(long timeout) { - FileCanonPathCache.timeout = timeout; - } -} diff --git a/luni/src/test/java/org/apache/harmony/luni/tests/java/io/AllTests.java b/luni/src/test/java/org/apache/harmony/luni/tests/java/io/AllTests.java index 056b521..778e527 100644 --- a/luni/src/test/java/org/apache/harmony/luni/tests/java/io/AllTests.java +++ b/luni/src/test/java/org/apache/harmony/luni/tests/java/io/AllTests.java @@ -34,7 +34,6 @@ public class AllTests TestSuite suite = tests.TestSuiteFactory.createTestSuite("Tests for java.io"); suite.addTestSuite(BufferedReaderTest.class); - suite.addTestSuite(FileCanonPathCacheTest.class); suite.addTestSuite(FilePermissionTest.class); suite.addTestSuite(FileTest.class); suite.addTestSuite(InputStreamReaderTest.class); diff --git a/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileCanonPathCacheTest.java b/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileCanonPathCacheTest.java deleted file mode 100644 index f2ac7f3..0000000 --- a/luni/src/test/java/org/apache/harmony/luni/tests/java/io/FileCanonPathCacheTest.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.harmony.luni.tests.java.io; - -import java.io.File; - -import org.apache.harmony.luni.internal.io.FileCanonPathCache; - -import junit.framework.TestCase; - -public class FileCanonPathCacheTest extends TestCase { - - private static int DEFAULT_TIMEOUT = 600000; - - @Override - public void setUp() throws Exception { - FileCanonPathCache.clear(); - FileCanonPathCache.setTimeout(DEFAULT_TIMEOUT); - } - - public void testGetSet() throws Exception { - File file1 = new File("test/hello~1"); - assertNull(FileCanonPathCache.get(file1.getAbsolutePath())); - FileCanonPathCache.put(file1.getAbsolutePath(), file1 - .getCanonicalPath()); - assertEquals(file1.getCanonicalPath(), FileCanonPathCache.get(file1 - .getAbsolutePath())); - - File file2 = new File("test/world~1"); - assertNull(FileCanonPathCache.get(file2.getAbsolutePath())); - FileCanonPathCache.put(file2.getAbsolutePath(), file2 - .getCanonicalPath()); - assertEquals(file2.getCanonicalPath(), FileCanonPathCache.get(file2 - .getAbsolutePath())); - - assertNull(FileCanonPathCache.get("notexist")); - } - - public void testGetTimeout01() throws Exception { - FileCanonPathCache.setTimeout(10); - - File file1 = new File("test/hello~1"); - assertNull(FileCanonPathCache.get(file1.getAbsolutePath())); - FileCanonPathCache.put(file1.getAbsolutePath(), file1 - .getCanonicalPath()); - Thread.sleep(50); - assertNull(FileCanonPathCache.get(file1.getAbsolutePath())); - } - - public void testGetTimeout02() throws Exception { - FileCanonPathCache.setTimeout(10); - - File file1 = new File("test/hello~1"); - assertNull(FileCanonPathCache.get(file1.getAbsolutePath())); - FileCanonPathCache.put(file1.getAbsolutePath(), file1 - .getCanonicalPath()); - File file2 = new File("test/hello~2"); - assertNull(FileCanonPathCache.get(file2.getAbsolutePath())); - FileCanonPathCache.put(file2.getAbsolutePath(), file2 - .getCanonicalPath()); - File file3 = new File("test/hello~3"); - assertNull(FileCanonPathCache.get(file3.getAbsolutePath())); - FileCanonPathCache.put(file3.getAbsolutePath(), file3 - .getCanonicalPath()); - File file4 = new File("test/hello~4"); - assertNull(FileCanonPathCache.get(file4.getAbsolutePath())); - FileCanonPathCache.put(file4.getAbsolutePath(), file4 - .getCanonicalPath()); - File file5 = new File("test/hello~5"); - assertNull(FileCanonPathCache.get(file5.getAbsolutePath())); - FileCanonPathCache.put(file5.getAbsolutePath(), file5 - .getCanonicalPath()); - - Thread.sleep(50); - - assertNull(FileCanonPathCache.get(file1.getAbsolutePath())); - assertNull(FileCanonPathCache.get(file2.getAbsolutePath())); - assertNull(FileCanonPathCache.get(file3.getAbsolutePath())); - assertNull(FileCanonPathCache.get(file4.getAbsolutePath())); - assertNull(FileCanonPathCache.get(file5.getAbsolutePath())); - } - - public void testCacheFull() throws Exception { - int cacheSize = FileCanonPathCache.CACHE_SIZE; - File[] files = new File[cacheSize]; - for (int i = 0; i < cacheSize; ++i) { - files[i] = new File("test/world" + i); - FileCanonPathCache.put(files[i].getAbsolutePath(), files[i] - .getCanonicalPath()); - } - - for (int i = cacheSize; i < files.length; ++i) { - assertEquals(files[i - cacheSize].getCanonicalPath(), - FileCanonPathCache.get(files[i - cacheSize] - .getAbsolutePath())); - files[i] = new File("test/world" + i); - FileCanonPathCache.put(files[i].getAbsolutePath(), files[i] - .getCanonicalPath()); - assertEquals(files[i].getCanonicalPath(), FileCanonPathCache - .get(files[i].getAbsolutePath())); - assertNull(FileCanonPathCache.get(files[i - cacheSize] - .getAbsolutePath())); - } - } -} diff --git a/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java b/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java index f8b0b7e..6c36ec2 100644 --- a/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java +++ b/nio_char/src/test/java/org/apache/harmony/nio_char/tests/java/nio/charset/CharsetTest.java @@ -16,24 +16,17 @@ package org.apache.harmony.nio_char.tests.java.nio.charset; +import dalvik.annotation.TestLevel; import dalvik.annotation.TestTargetClass; -import dalvik.annotation.TestTargets; import dalvik.annotation.TestTargetNew; -import dalvik.annotation.TestLevel; +import junit.framework.TestCase; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.nio.charset.CharsetEncoder; -import java.nio.charset.CoderResult; import java.nio.charset.IllegalCharsetNameException; import java.util.HashSet; import java.util.Iterator; import java.util.Properties; import java.util.Set; - -import junit.framework.TestCase; @TestTargetClass(Charset.class) public class CharsetTest extends TestCase { @@ -181,153 +174,4 @@ public class CharsetTest extends TestCase { Charset cs4 = Charset.forName("US-ASCII"); assertSame(cs3, cs4); } - - /* - * test cached decoder - */ - @TestTargetNew( - level = TestLevel.COMPLETE, - notes = "This test is quite useless for the rest it does, though.", - method = "Charset", - args = {java.lang.String.class, java.lang.String[].class} - ) - public void test_DecodeLjava_nio_ByteBuffer() throws Exception{ - MockCharsetForDecoder cs1 = new MockCharsetForDecoder("CachedCharset",null); - MockCharsetForDecoder cs2 = new MockCharsetForDecoder("CachedCharset",null); - ByteBuffer in = ByteBuffer.wrap(new byte[]{0x00}); - cs1.decode(in); - in.flip(); - cs2.decode(in); - in.flip(); - } - /* - * Mock Charset for cached decoder test - */ - static class MockCharsetForDecoder extends Charset{ - - public MockCharsetForDecoder(String canonicalName, String[] aliases){ - super(canonicalName, aliases); - } - - public boolean contains(Charset charset) { - return false; - } - - public CharsetEncoder newEncoder() { - return null; - } - - public CharsetDecoder newDecoder() { - return new MockCachedDecoder(this); - } - - - } - /* - * Mock decoder. Only one caller is permitted. - */ - static class MockCachedDecoder extends CharsetDecoder { - static MockCachedDecoder caller = null; - - public MockCachedDecoder(Charset cs) { - super(cs, 1, 10); - } - - /* - * Only one caller is permitted. - * If there's another caller, throw RuntimeException. - */ - protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { - if(null == caller){ - caller = this; - }else{ - if(caller != this){ - // Another instance - fail("should use the same instance"); - } - } - return CoderResult.UNDERFLOW; - } - } - - /* - * test cached encoder - */ - @TestTargetNew( - level = TestLevel.PARTIAL, - notes = "Functional test.", - method = "encode", - args = {java.nio.CharBuffer.class} - ) - public void test_EncodeLjava_nio_CharBuffer() throws Exception { - MockCharsetForEncoder cs1 = new MockCharsetForEncoder("CachedCharset", null); - MockCharsetForEncoder cs2 = new MockCharsetForEncoder("CachedCharset", null); - CharBuffer in = CharBuffer.wrap("A"); - cs1.encode(in); - in.flip(); - cs2.encode(in); - } - - /* - * Mock Charset for cached encoder test - */ - static class MockCharsetForEncoder extends Charset { - - public MockCharsetForEncoder(String canonicalName, String[] aliases) { - super(canonicalName, aliases); - } - - public boolean contains(Charset charset) { - return false; - } - - public CharsetDecoder newDecoder() { - return new MockDecoderForEncoder(this); - } - - public CharsetEncoder newEncoder() { - return new MockCachedEncoder(this); - } - } - - /* - * Mock encoder. Only one caller is permitted. - */ - static class MockCachedEncoder extends CharsetEncoder { - static MockCachedEncoder caller = null; - - public MockCachedEncoder(Charset cs) { - super(cs, 1, 10); - } - - /* - * Only one caller is permitted. - */ - protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) { - if (null == caller) { - caller = this; - } else { - if (caller != this) { - // Another instance - fail("should use the same instance"); - } - } - return CoderResult.UNDERFLOW; - } - } - - /* - * Mock decoder for MockCachedEncoder. - */ - static class MockDecoderForEncoder extends CharsetDecoder { - public MockDecoderForEncoder(Charset cs) { - super(cs, 1, 10); - } - - protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) { - in.position(in.limit()); - return CoderResult.UNDERFLOW; - } - } - } diff --git a/nio_char/src/test/java/tests/api/java/nio/charset/CharsetDecoderTest.java b/nio_char/src/test/java/tests/api/java/nio/charset/CharsetDecoderTest.java index 33bafd4..315d667 100644 --- a/nio_char/src/test/java/tests/api/java/nio/charset/CharsetDecoderTest.java +++ b/nio_char/src/test/java/tests/api/java/nio/charset/CharsetDecoderTest.java @@ -55,11 +55,12 @@ public class CharsetDecoderTest extends AbstractCharsetDecoderTestCase { protected void setUp() throws Exception { - super.setUp(); - cs = new CharsetEncoderTest.MockCharset("mock", new String[0]); unibytes = new byte[] { 32, 98, 117, 102, 102, 101, 114 }; decoder = cs.newDecoder(); + + // for this test's weird superclass, super.setUp() needs to be run last + super.setUp(); } |