The changes for using AccessController/SecurityManager also added a log which now spams a lot if log is enabled in integration-tests, reduce it a bit by not trying to call "cleaner()" on HeapByteBuffer which does not have it for sure
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1746411 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e9a1e2987f
commit
aad52afa12
@ -162,22 +162,27 @@ public class FileBackedDataSource extends DataSource {
|
|||||||
// unfortunately this might break silently with newer/other Java implementations,
|
// unfortunately this might break silently with newer/other Java implementations,
|
||||||
// but we at least have unit-tests which will indicate this when run on Windows
|
// but we at least have unit-tests which will indicate this when run on Windows
|
||||||
private static void unmap(final ByteBuffer buffer) {
|
private static void unmap(final ByteBuffer buffer) {
|
||||||
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
// not necessary for HeapByteBuffer, avoid lots of log-output on this class
|
||||||
@Override
|
if(buffer.getClass().getName().endsWith("HeapByteBuffer")) {
|
||||||
@SuppressForbidden("Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works")
|
return;
|
||||||
public Void run() {
|
}
|
||||||
try {
|
|
||||||
final Method getCleanerMethod = buffer.getClass().getMethod("cleaner");
|
AccessController.doPrivileged(new PrivilegedAction<Void>() {
|
||||||
getCleanerMethod.setAccessible(true);
|
@Override
|
||||||
final Object cleaner = getCleanerMethod.invoke(buffer);
|
@SuppressForbidden("Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works")
|
||||||
if (cleaner != null) {
|
public Void run() {
|
||||||
cleaner.getClass().getMethod("clean").invoke(cleaner);
|
try {
|
||||||
}
|
final Method getCleanerMethod = buffer.getClass().getMethod("cleaner");
|
||||||
} catch (Exception e) {
|
getCleanerMethod.setAccessible(true);
|
||||||
logger.log(POILogger.WARN, "Unable to unmap memory mapped ByteBuffer.", e);
|
final Object cleaner = getCleanerMethod.invoke(buffer);
|
||||||
}
|
if (cleaner != null) {
|
||||||
return null; // Void
|
cleaner.getClass().getMethod("clean").invoke(cleaner);
|
||||||
}
|
}
|
||||||
});
|
} catch (Exception e) {
|
||||||
|
logger.log(POILogger.WARN, "Unable to unmap memory mapped ByteBuffer.", e);
|
||||||
|
}
|
||||||
|
return null; // Void
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,20 +19,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.poifs.nio;
|
package org.apache.poi.poifs.nio;
|
||||||
|
|
||||||
import java.io.File;
|
import junit.framework.TestCase;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.nio.BufferUnderflowException;
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
|
|
||||||
import org.apache.poi.POIDataSamples;
|
import org.apache.poi.POIDataSamples;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.util.TempFile;
|
import org.apache.poi.util.TempFile;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import java.io.*;
|
||||||
|
import java.nio.BufferUnderflowException;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for the datasource implementations
|
* Tests for the datasource implementations
|
||||||
@ -121,7 +115,7 @@ public class TestDataSource extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeDataToFile(File temp) throws FileNotFoundException, IOException {
|
private void writeDataToFile(File temp) throws IOException {
|
||||||
OutputStream str = new FileOutputStream(temp);
|
OutputStream str = new FileOutputStream(temp);
|
||||||
try {
|
try {
|
||||||
InputStream in = data.openResourceAsStream("Notes.ole2");
|
InputStream in = data.openResourceAsStream("Notes.ole2");
|
||||||
@ -153,11 +147,11 @@ public class TestDataSource extends TestCase
|
|||||||
assertEquals(0, bs.position());
|
assertEquals(0, bs.position());
|
||||||
assertEquals(0xd0 - 256, bs.get(0));
|
assertEquals(0xd0 - 256, bs.get(0));
|
||||||
assertEquals(0xcf - 256, bs.get(1));
|
assertEquals(0xcf - 256, bs.get(1));
|
||||||
assertEquals(0x11 - 000, bs.get(2));
|
assertEquals(0x11, bs.get(2));
|
||||||
assertEquals(0xe0 - 256, bs.get(3));
|
assertEquals(0xe0 - 256, bs.get(3));
|
||||||
assertEquals(0xd0 - 256, bs.get());
|
assertEquals(0xd0 - 256, bs.get());
|
||||||
assertEquals(0xcf - 256, bs.get());
|
assertEquals(0xcf - 256, bs.get());
|
||||||
assertEquals(0x11 - 000, bs.get());
|
assertEquals(0x11, bs.get());
|
||||||
assertEquals(0xe0 - 256, bs.get());
|
assertEquals(0xe0 - 256, bs.get());
|
||||||
|
|
||||||
// Mid way through
|
// Mid way through
|
||||||
@ -179,11 +173,12 @@ public class TestDataSource extends TestCase
|
|||||||
|
|
||||||
// Can't go off the end
|
// Can't go off the end
|
||||||
try {
|
try {
|
||||||
bs = ds.read(4, 8192);
|
ds.read(4, 8192);
|
||||||
if(!writeable) {
|
if(!writeable) {
|
||||||
fail("Shouldn't be able to read off the end of the file");
|
fail("Shouldn't be able to read off the end of the file");
|
||||||
}
|
}
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
|
// expected here
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,13 +223,17 @@ public class TestDataSource extends TestCase
|
|||||||
try {
|
try {
|
||||||
bs.get();
|
bs.get();
|
||||||
fail("Shouldn't be able to read off the end");
|
fail("Shouldn't be able to read off the end");
|
||||||
} catch(BufferUnderflowException e) {}
|
} catch(BufferUnderflowException e) {
|
||||||
|
// expected here
|
||||||
|
}
|
||||||
|
|
||||||
// Past the end
|
// Past the end
|
||||||
try {
|
try {
|
||||||
bs = ds.read(4, 256);
|
ds.read(4, 256);
|
||||||
fail("Shouldn't be able to read off the end");
|
fail("Shouldn't be able to read off the end");
|
||||||
} catch(IndexOutOfBoundsException e) {}
|
} catch(IndexOutOfBoundsException e) {
|
||||||
|
// expected here
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Overwrite
|
// Overwrite
|
||||||
|
@ -125,13 +125,12 @@ public class TestHexDump {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
obj[17] = chrs.toString();
|
obj[17] = chrs.toString();
|
||||||
format.append("%18$s"+HexDump.EOL);
|
format.append("%18$s").append(HexDump.EOL);
|
||||||
|
|
||||||
String str = String.format(LocaleUtil.getUserLocale(), format.toString(), obj);
|
String str = String.format(LocaleUtil.getUserLocale(), format.toString(), obj);
|
||||||
strExp.append(str);
|
strExp.append(str);
|
||||||
}
|
}
|
||||||
byte bytesExp[] = strExp.toString().getBytes(HexDump.UTF8);
|
return strExp.toString().getBytes(HexDump.UTF8);
|
||||||
return bytesExp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -157,7 +156,7 @@ public class TestHexDump {
|
|||||||
|
|
||||||
assertEquals("FFFF", HexDump.toHex((short)0xFFFF));
|
assertEquals("FFFF", HexDump.toHex((short)0xFFFF));
|
||||||
|
|
||||||
assertEquals("00000000000004D2", HexDump.toHex(1234l));
|
assertEquals("00000000000004D2", HexDump.toHex(1234L));
|
||||||
|
|
||||||
assertEquals("0xFE", HexDump.byteToHex(-2));
|
assertEquals("0xFE", HexDump.byteToHex(-2));
|
||||||
assertEquals("0x25", HexDump.byteToHex(37));
|
assertEquals("0x25", HexDump.byteToHex(37));
|
||||||
@ -185,18 +184,28 @@ public class TestHexDump {
|
|||||||
|
|
||||||
@Test(expected=ArrayIndexOutOfBoundsException.class)
|
@Test(expected=ArrayIndexOutOfBoundsException.class)
|
||||||
public void testDumpToStringOutOfIndex1() throws Exception {
|
public void testDumpToStringOutOfIndex1() throws Exception {
|
||||||
HexDump.dump(new byte[ 1 ], 0, -1);
|
HexDump.dump(new byte[1], 0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected=ArrayIndexOutOfBoundsException.class)
|
@Test(expected=ArrayIndexOutOfBoundsException.class)
|
||||||
public void testDumpToStringOutOfIndex2() throws Exception {
|
public void testDumpToStringOutOfIndex2() throws Exception {
|
||||||
HexDump.dump(new byte[ 1 ], 0, 2);
|
HexDump.dump(new byte[1], 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected=ArrayIndexOutOfBoundsException.class)
|
||||||
public void testDumpToStringOutOfIndex3() throws Exception {
|
public void testDumpToStringOutOfIndex3() throws Exception {
|
||||||
HexDump.dump(new byte[ 1 ], 0, 1);
|
HexDump.dump(new byte[1], 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDumpToStringNoDataEOL1() throws Exception {
|
||||||
|
HexDump.dump(new byte[0], 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDumpToStringNoDataEOL2() throws Exception {
|
||||||
|
HexDump.dump(new byte[0], 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDumpToPrintStream() throws IOException {
|
public void testDumpToPrintStream() throws IOException {
|
||||||
|
Loading…
Reference in New Issue
Block a user