Skip to content

Commit 74c6dd0

Browse files
committed
issue 50 : AutoCloseable ClassNotFoundError on JDK6
1 parent be9189a commit 74c6dd0

10 files changed

+95
-288
lines changed

pom.xml

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,6 @@
1313

1414
<build>
1515
<plugins>
16-
<plugin>
17-
<groupId>org.codehaus.mojo</groupId>
18-
<artifactId>build-helper-maven-plugin</artifactId>
19-
<version>1.1</version>
20-
<executions>
21-
<!-- This is a horrible hack. We need to support AutoCloseable
22-
which is @since 1.7 but also need to compile on 1.6. -->
23-
<execution>
24-
<phase>generate-sources</phase>
25-
<goals><goal>add-source</goal></goals>
26-
<configuration>
27-
<sources>
28-
<source>src/main/java-${java.vm.specification.version}</source>
29-
</sources>
30-
</configuration>
31-
</execution>
32-
</executions>
33-
</plugin>
34-
3516
<!-- http://www.javaworld.com/article/2074515/core-java/
3617
unit-test-code-coverage-with-maven-and-jacoco.html -->
3718
<plugin>

src/main/java-1.0/org/owasp/html/AutoCloseableHtmlStreamRenderer.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/main/java-1.7/org/owasp/html/AutoCloseableHtmlStreamRenderer.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/main/java-1.7/org/owasp/html/HtmlStreamEventReceiverWrapper.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/main/java-1.8/org/owasp/html/AutoCloseableHtmlStreamRenderer.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/main/java-1.8/org/owasp/html/HtmlStreamEventReceiverWrapper.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/main/java-1.9/org/owasp/html/AutoCloseableHtmlStreamRenderer.java

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/main/java-1.9/org/owasp/html/HtmlStreamEventReceiverWrapper.java

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.owasp.html;
2+
3+
import java.io.Closeable;
4+
import java.io.IOException;
5+
import java.lang.reflect.InvocationTargetException;
6+
import java.lang.reflect.Method;
7+
8+
import javax.annotation.WillCloseWhenClosed;
9+
10+
import com.google.common.base.Throwables;
11+
12+
final class AutoCloseableHtmlStreamRenderer extends HtmlStreamRenderer
13+
// This is available on JDK6 and makes this class extend AutoCloseable.
14+
implements Closeable {
15+
private final Object closeable;
16+
17+
private static final Class<?> CLASS_AUTO_CLOSEABLE;
18+
19+
static {
20+
Class<?> classAutoCloseable = null;
21+
for (Class<?> superInterface : Closeable.class.getInterfaces()) {
22+
if ("java.lang.Autocloseable".equals(superInterface.getName())) {
23+
classAutoCloseable = superInterface;
24+
break;
25+
}
26+
}
27+
CLASS_AUTO_CLOSEABLE = classAutoCloseable;
28+
}
29+
30+
private static final Method METHOD_CLOSE;
31+
32+
static {
33+
Method methodClose = null;
34+
if (CLASS_AUTO_CLOSEABLE != null) {
35+
try {
36+
methodClose = CLASS_AUTO_CLOSEABLE.getMethod("close");
37+
} catch (NoSuchMethodException ex) {
38+
throw (NoSuchMethodError) new NoSuchMethodError().initCause(ex);
39+
}
40+
}
41+
METHOD_CLOSE = methodClose;
42+
}
43+
44+
static boolean isAutoCloseable(Object o) {
45+
return o instanceof Closeable
46+
|| CLASS_AUTO_CLOSEABLE != null && CLASS_AUTO_CLOSEABLE.isInstance(o);
47+
}
48+
49+
static AutoCloseableHtmlStreamRenderer createAutoCloseableHtmlStreamRenderer(
50+
@WillCloseWhenClosed
51+
Appendable output, Handler<? super IOException> errorHandler,
52+
Handler<? super String> badHtmlHandler) {
53+
return new AutoCloseableHtmlStreamRenderer(
54+
output, errorHandler, badHtmlHandler);
55+
}
56+
57+
private AutoCloseableHtmlStreamRenderer(
58+
@WillCloseWhenClosed
59+
Appendable output, Handler<? super IOException> errorHandler,
60+
Handler<? super String> badHtmlHandler) {
61+
super(output, errorHandler, badHtmlHandler);
62+
this.closeable = output;
63+
}
64+
65+
private static final Object[] ZERO_OBJECTS = new Object[0];
66+
67+
public void close() throws IOException {
68+
if (isDocumentOpen()) { closeDocument(); }
69+
closeIfAnyCloseable(closeable);
70+
}
71+
72+
static void closeIfAnyCloseable(Object closeable) throws IOException {
73+
if (closeable instanceof Closeable) {
74+
((Closeable) closeable).close();
75+
} else if (METHOD_CLOSE != null) {
76+
try {
77+
METHOD_CLOSE.invoke(closeable, ZERO_OBJECTS);
78+
} catch (IllegalAccessException ex) {
79+
throw new AssertionError("close not public", ex);
80+
} catch (InvocationTargetException ex) {
81+
Throwable tgt = ex.getTargetException();
82+
if (tgt instanceof IOException) {
83+
throw (IOException) tgt;
84+
} else {
85+
Throwables.propagate(tgt);
86+
}
87+
}
88+
}
89+
}
90+
}

0 commit comments

Comments
 (0)