You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tc...@apache.org on 2006/06/04 16:37:30 UTC

svn commit: r411565 - in /jakarta/commons/sandbox/jci/trunk: ./ compilers/javac/ compilers/javac/src/ compilers/javac/src/java/ compilers/javac/src/java/org/ compilers/javac/src/java/org/apache/ compilers/javac/src/java/org/apache/commons/ compilers/ja...

Author: tcurdt
Date: Sun Jun  4 07:37:29 2006
New Revision: 411565

URL: http://svn.apache.org/viewvc?rev=411565&view=rev
Log:
GSoC: first implementation of javac compiler by Peter Konstantinov


Added:
    jakarta/commons/sandbox/jci/trunk/compilers/javac/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/pom.xml   (with props)
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/FileInputStreamProxy.java   (with props)
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacClassLoader.java   (with props)
    jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacJavaCompiler.java   (with props)
Modified:
    jakarta/commons/sandbox/jci/trunk/pom.xml

Added: jakarta/commons/sandbox/jci/trunk/compilers/javac/pom.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/javac/pom.xml?rev=411565&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/javac/pom.xml (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/javac/pom.xml Sun Jun  4 07:37:29 2006
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<packaging>jar</packaging>
+
+	<parent>
+		<groupId>org.apache.commons</groupId>
+		<artifactId>commons-jci</artifactId>
+		<version>1.0-SNAPSHOT</version>
+	</parent>
+
+	<groupId>org.apache.commons</groupId>
+	<artifactId>commons-jci-javac</artifactId>
+	<version>1.0-SNAPSHOT</version>
+
+	<name>Compiler Javac</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-jci-core</artifactId>
+			<version>1.0-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>javassist</groupId>
+			<artifactId>javassist</artifactId>
+			<version>3.0</version>
+		</dependency>
+	</dependencies>
+</project>

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/FileInputStreamProxy.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/FileInputStreamProxy.java?rev=411565&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/FileInputStreamProxy.java (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/FileInputStreamProxy.java Sun Jun  4 07:37:29 2006
@@ -0,0 +1,114 @@
+package org.apache.commons.jci.compilers;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.FileChannel;
+import org.apache.commons.jci.readers.ResourceReader;
+
+public class FileInputStreamProxy extends InputStream
+{
+	private InputStream inputStream = null;
+
+	ResourceReader reader = null;
+
+	public FileInputStreamProxy(File file) throws FileNotFoundException
+	{
+		if (getReader().isAvailable(file.getName()))
+			inputStream = new ByteArrayInputStream(getReader().getBytes(file.getName()));
+		else
+			inputStream = new FileInputStream(file);
+	}
+
+	public FileInputStreamProxy(FileDescriptor fdObj)
+	{
+		inputStream = new FileInputStream(fdObj);
+	}
+
+	public FileInputStreamProxy(String name) throws FileNotFoundException
+	{
+		if (getReader().isAvailable(name))
+			inputStream = new ByteArrayInputStream(getReader().getBytes(name));
+		else
+		inputStream = new FileInputStream(name);
+	}
+
+	private ResourceReader getReader()
+	{
+		if (reader == null)
+		{
+			JavacClassLoader loader = (JavacClassLoader)Thread.currentThread().getContextClassLoader();
+			reader = loader.getReader();
+		}
+		return reader;
+	}
+
+	public int available() throws IOException
+	{
+		return inputStream.available();
+	}
+
+	public void close() throws IOException
+	{
+		inputStream.close();
+	}
+
+	public boolean equals(Object obj)
+	{
+		return inputStream.equals(obj);
+	}
+
+	public FileChannel getChannel()
+	{
+		throw new RuntimeException(":(");
+	}
+
+	public int hashCode()
+	{
+		return inputStream.hashCode();
+	}
+
+	public void mark(int readlimit)
+	{
+		inputStream.mark(readlimit);
+	}
+
+	public boolean markSupported()
+	{
+		return inputStream.markSupported();
+	}
+
+	public int read() throws IOException
+	{
+		return inputStream.read();
+	}
+
+	public int read(byte[] b, int off, int len) throws IOException
+	{
+		return inputStream.read(b, off, len);
+	}
+
+	public int read(byte[] b) throws IOException
+	{
+		return inputStream.read(b);
+	}
+
+	public void reset() throws IOException
+	{
+		inputStream.reset();
+	}
+
+	public long skip(long n) throws IOException
+	{
+		return inputStream.skip(n);
+	}
+
+	public String toString()
+	{
+		return inputStream.toString();
+	}
+}

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/FileInputStreamProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/FileInputStreamProxy.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacClassLoader.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacClassLoader.java?rev=411565&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacClassLoader.java (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacClassLoader.java Sun Jun  4 07:37:29 2006
@@ -0,0 +1,65 @@
+package org.apache.commons.jci.compilers;
+
+import java.io.FileInputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import javassist.ClassPool;
+import javassist.CtClass;
+import org.apache.commons.jci.readers.ResourceReader;
+import org.apache.commons.jci.stores.ResourceStore;
+
+public class JavacClassLoader extends URLClassLoader
+{
+	private ClassPool classPool;
+
+	private ResourceReader reader;
+
+	private ResourceStore store;
+
+	public JavacClassLoader(ClassPool classPool, ResourceReader reader,
+			ResourceStore store, URL[] urls, ClassLoader parent)
+	{
+		super(urls, parent);
+		this.classPool = classPool;
+		this.reader = reader;
+		this.store = store;
+	}
+
+	protected Class findClass(String name) throws ClassNotFoundException
+	{
+		// System.out.println(name);
+		if (name.equals(JavacClassLoader.class.getName()))
+		{
+			return JavacClassLoader.class;
+		}
+		if (name.equals(ResourceReader.class.getName()))
+		{
+			return ResourceReader.class;
+		}
+		try
+		{
+			// if (!name.equals(FileInputStreamProxy.class.getName()))
+			if (name.equals("com.sun.tools.javac.main.JavaCompiler"))
+			{
+				CtClass jc = classPool.get(name);
+				jc.replaceClassName(FileInputStream.class.getName(),
+						FileInputStreamProxy.class.getName());
+				return jc.toClass();
+			}
+		}
+		catch (Exception e)
+		{
+		}
+		return super.findClass(name);
+	}
+
+	public ResourceReader getReader()
+	{
+		return reader;
+	}
+
+	public ResourceStore getStore()
+	{
+		return store;
+	}
+}
\ No newline at end of file

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacClassLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacClassLoader.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacJavaCompiler.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacJavaCompiler.java?rev=411565&view=auto
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacJavaCompiler.java (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacJavaCompiler.java Sun Jun  4 07:37:29 2006
@@ -0,0 +1,96 @@
+package org.apache.commons.jci.compilers;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import javassist.ClassPool;
+import javassist.NotFoundException;
+import org.apache.commons.jci.readers.ResourceReader;
+import org.apache.commons.jci.stores.ResourceStore;
+import org.apache.commons.lang.ArrayUtils;
+
+public class JavacJavaCompiler extends AbstractJavaCompiler
+{
+	public CompilationResult compile(String[] resourcePaths,
+			ResourceReader reader, ResourceStore store,
+			ClassLoader baseClassLoader)
+	{
+		File toolsJar = new File(System.getProperty("java.home"),
+				"../lib/tools.jar");
+		URL[] urls = null;
+		try
+		{
+			if (baseClassLoader instanceof URLClassLoader)
+			{
+				urls = (URL[]) ArrayUtils.add(
+						((URLClassLoader) baseClassLoader).getURLs(), toolsJar
+								.toURL());
+			}
+			else
+			{
+				urls = new URL[] { new File(".").toURI().toURL(),
+						toolsJar.toURL() };
+			}
+		}
+		catch (MalformedURLException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		ClassPool classPool = ClassPool.getDefault();
+		JavacClassLoader javacClassLoader = new JavacClassLoader(classPool,
+				reader, store, urls, baseClassLoader.getParent());
+		ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+		Thread.currentThread().setContextClassLoader(javacClassLoader);
+		Class javacMain = null;
+		try
+		{
+			javacMain = javacClassLoader.loadClass("com.sun.tools.javac.Main");
+		}
+		catch (ClassNotFoundException e)
+		{
+			e.printStackTrace();
+		}
+		Method compile = null;
+		try
+		{
+			compile = javacMain.getMethod("compile", new Class[] {
+					String[].class, PrintWriter.class });
+		}
+		catch (SecurityException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		catch (NoSuchMethodException e)
+		{
+			e.printStackTrace();
+		}
+		try
+		{
+			compile.invoke(null, new Object[] { new String[] { "test.java" },
+					new PrintWriter(System.out) });
+		}
+		catch (IllegalArgumentException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		catch (IllegalAccessException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		catch (InvocationTargetException e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		Thread.currentThread().setContextClassLoader(oldLoader);
+		return null;
+	}
+}

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacJavaCompiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/commons/sandbox/jci/trunk/compilers/javac/src/java/org/apache/commons/jci/compilers/JavacJavaCompiler.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: jakarta/commons/sandbox/jci/trunk/pom.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/pom.xml?rev=411565&r1=411564&r2=411565&view=diff
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/pom.xml (original)
+++ jakarta/commons/sandbox/jci/trunk/pom.xml Sun Jun  4 07:37:29 2006
@@ -30,6 +30,7 @@
     <module>compilers/eclipse</module>
     <module>compilers/janino</module>
     <module>compilers/groovy</module>
+    <module>compilers/javac</module>
     <module>tests</module>
     <module>examples</module>
   </modules>
@@ -131,7 +132,7 @@
       <plugin>
         <artifactId>maven-site-plugin</artifactId>
         <groupId>org.apache.maven.plugins</groupId>
-        <version>2.0-SNAPSHOT</version>
+        <version>2.0-beta-5</version>
       </plugin>
     </plugins>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org