Skip to content

Instantly share code, notes, and snippets.

@neilellis
Last active August 29, 2015 14:27
Show Gist options
  • Save neilellis/2c3b8f35b752235d7e78 to your computer and use it in GitHub Desktop.
Save neilellis/2c3b8f35b752235d7e78 to your computer and use it in GitHub Desktop.
How to make sure you're Java examples in a README compiles and runs.
package com.sillelien.dollar;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import org.pegdown.Extensions;
import org.pegdown.PegDownProcessor;
import org.pegdown.ast.RootNode;
import java.io.File;
import java.io.IOException;
import static com.sillelien.dollar.api.DollarStatic.$;
/**
* @author hello@neilellis.me
*/
public class DocTest {
@Test
public void test() throws IOException {
PegDownProcessor processor = new PegDownProcessor(Extensions.FENCED_CODE_BLOCKS);
RootNode rootNode = processor.parseMarkdown(FileUtils.readFileToString(new File("README.md")).toCharArray());
rootNode.accept(new DocTestingVisitor());
}
}
package com.sillelien.dollar;
/*
* Copyright (c) 2014-2015 Neil Ellis
*
* Licensed 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.
*/
import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.NotNull;
import org.pegdown.ast.*;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class DocTestingVisitor implements Visitor {
@Override
public void visit(AbbreviationNode node) {
}
// @Override
// public void visit(AnchorLinkNode anchorLinkNode) {
//
// }
@Override
public void visit(AutoLinkNode node) {
}
@Override
public void visit(BlockQuoteNode node) {
}
@Override
public void visit(BulletListNode node) {
}
@Override
public void visit(CodeNode node) {
}
@Override
public void visit(DefinitionListNode node) {
}
@Override
public void visit(DefinitionNode node) {
}
@Override
public void visit(DefinitionTermNode node) {
}
@Override
public void visit(ExpImageNode node) {
}
@Override
public void visit(ExpLinkNode node) {
}
@Override
public void visit(HeaderNode node) {
}
@Override
public void visit(HtmlBlockNode node) {
}
@Override
public void visit(InlineHtmlNode node) {
}
@Override
public void visit(ListItemNode node) {
}
@Override
public void visit(MailLinkNode node) {
}
@Override
public void visit(OrderedListNode node) {
}
@Override
public void visit(@NotNull ParaNode node) {
visitChildren(node);
}
@Override
public void visit(QuotedNode node) {
}
@Override
public void visit(ReferenceNode node) {
}
@Override
public void visit(RefImageNode node) {
}
@Override
public void visit(RefLinkNode node) {
}
@Override
public void visit(@NotNull RootNode node) {
node.getReferences().forEach(this::visitChildren);
node.getAbbreviations().forEach(this::visitChildren);
visitChildren(node);
}
@Override
public void visit(SimpleNode node) {
}
@Override
public void visit(SpecialTextNode node) {
}
@Override
public void visit(StrikeNode node) {
}
@Override
public void visit(StrongEmphSuperNode node) {
}
@Override
public void visit(TableBodyNode node) {
}
@Override
public void visit(TableCaptionNode node) {
}
@Override
public void visit(TableCellNode node) {
}
@Override
public void visit(TableColumnNode node) {
}
@Override
public void visit(TableHeaderNode node) {
}
@Override
public void visit(TableNode node) {
}
@Override
public void visit(TableRowNode node) {
}
@Override
public void visit(@NotNull VerbatimNode node) {
if ("java".equals(node.getType())) {
try {
String name = "DocTemp"+System.currentTimeMillis();
File javaFile = new File("/tmp/" + name + ".java");
File clazzFile = new File("/tmp/" + name + ".class");
clazzFile.getParentFile().mkdirs();
FileUtils.write(javaFile,
"import com.sillelien.dollar.api.*;\n" +
"import static com.sillelien.dollar.api.DollarStatic.*;\n" +
"public class " + name + " implements java.lang.Runnable{\n" +
" public void run() {\n" +
" " + node.getText() + "\n" +
" }\n" +
"}");
final JavaCompiler javac
= ToolProvider.getSystemJavaCompiler();
final StandardJavaFileManager jfm
= javac.getStandardFileManager(null, null, null);
JavaCompiler.CompilationTask task;
try (FileOutputStream fileOutputStream = FileUtils.openOutputStream(clazzFile)) {
task = javac.getTask(new OutputStreamWriter(fileOutputStream), jfm, new DiagnosticCollector<>(), null, null,
jfm.getJavaFileObjects(javaFile));
}
task.call();
try {
// Convert File to a URL
URL url = clazzFile.getParentFile().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass(name);
((Runnable) cls.newInstance()).run();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("Parsed: " + node.getText());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void visit(WikiLinkNode node) {
}
@Override
public void visit(TextNode node) {
}
@Override
public void visit(@NotNull SuperNode node) {
visitChildren(node);
}
@Override
public void visit(Node node) {
}
void visitChildren(@NotNull SuperNode node) {
for (Node child : node.getChildren()) {
child.accept(this);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment