package net.sf.jasperreports.engine.design; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import net.sf.jasperreports.engine.JRException; public class JRJavacCompiler extends JRAbstractMultiClassCompiler { public String compileClasses(File[] sourceFiles, String classpath) throws JRException { String[] source = new String[sourceFiles.length + 3]; source[0] = "javac"; source[1] = "-classpath"; source[2] = classpath; for (int i = 0; i < sourceFiles.length; i++) source[i + 3] = sourceFiles[i].getPath(); try { Process compile = Runtime.getRuntime().exec(source); InputStream errFile = compile.getErrorStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int count = 0; do { count = errFile.read(buffer); if (count <= 0) continue; baos.write(buffer, 0, count); } while (count >= 0); if (baos.toString().indexOf("error") != -1) return baos.toString(); return null; } catch (Exception e) { StringBuffer files = new StringBuffer(); for (int j = 0; j < sourceFiles.length; j++) { files.append(sourceFiles[j].getPath()); files.append(' '); } throw new JRException("Error compiling report java source files : " + files, e); } } }