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 2007/02/26 01:47:12 UTC
svn commit: r511677 - in /jakarta/commons/sandbox/jci/trunk/compilers/rhino:
./ src/ src/main/ src/main/java/ src/main/java/org/
src/main/java/org/apache/ src/main/java/org/apache/commons/
src/main/java/org/apache/commons/jci/ src/main/java/org/apache/...
Author: tcurdt
Date: Sun Feb 25 16:47:10 2007
New Revision: 511677
URL: http://svn.apache.org/viewvc?view=rev&rev=511677
Log:
a first sort of working version of compiling javascript to java through rhino via jci. still needs some work
Added:
jakarta/commons/sandbox/jci/trunk/compilers/rhino/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml (with props)
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java (with props)
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java (with props)
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java (with props)
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/
jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java (with props)
Added: jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml?view=auto&rev=511677
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml Sun Feb 25 16:47:10 2007
@@ -0,0 +1,35 @@
+<?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>
+ <parent>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-jci</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </parent>
+
+ <packaging>jar</packaging>
+ <artifactId>commons-jci-rhino</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <name>compiler-rhino</name>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-jci-core</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>rhino</groupId>
+ <artifactId>js</artifactId>
+ <version>1.6R5</version>
+ </dependency>
+
+ </dependencies>
+
+</project>
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/pom.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java?view=auto&rev=511677
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java Sun Feb 25 16:47:10 2007
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.commons.jci.compilers;
+
+import org.apache.commons.jci.problems.CompilationProblem;
+
+public final class RhinoCompilationProblem implements CompilationProblem {
+
+ public int getEndColumn() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getEndLine() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public String getFileName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getMessage() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public int getStartColumn() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getStartLine() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public boolean isError() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+
+}
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java
------------------------------------------------------------------------------
svn:executable = *
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilationProblem.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java?view=auto&rev=511677
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java Sun Feb 25 16:47:10 2007
@@ -0,0 +1,235 @@
+package org.apache.commons.jci.compilers;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+
+import org.apache.commons.jci.readers.ResourceReader;
+import org.apache.commons.jci.stores.ResourceStore;
+import org.mozilla.javascript.CompilerEnvirons;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.GeneratedClassLoader;
+import org.mozilla.javascript.ImporterTopLevel;
+import org.mozilla.javascript.JavaScriptException;
+import org.mozilla.javascript.NativeArray;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+import org.mozilla.javascript.optimizer.ClassCompiler;
+
+/**
+ * @author tcurdt
+ * based on code from dev.helma.org
+ * http://dev.helma.org/source/file/helma/branches/rhinoloader/src/org/helma/javascript/RhinoLoader.java/?revision=95
+ */
+
+public final class RhinoCompilingClassLoader extends ClassLoader {
+
+
+ File scriptDir;
+ private final ScriptableObject scope;
+ private final ResourceReader reader;
+ private final ResourceStore store;
+
+ public RhinoCompilingClassLoader( final ResourceReader pReader, final ResourceStore pStore, final ClassLoader pClassLoader) {
+ super(pClassLoader);
+
+ reader = pReader;
+ store = pStore;
+
+ final Context cx = Context.enter();
+ scope = new ImporterTopLevel(cx);
+ Context.exit();
+ }
+
+
+
+ /**
+ * Find and load a java class implemented in JavaScript.
+ * @param name the class name
+ * @return the class
+ * @throws ClassNotFoundException
+ * @throws JavaScriptException
+ */
+
+ protected Class findClass(String name) throws ClassNotFoundException {
+
+ final Context cx = Context.enter();
+
+ try {
+ return compileClass(cx, name);
+ } catch (IOException iox) {
+ throw new ClassNotFoundException(iox.getMessage(), iox);
+ } finally {
+ Context.exit();
+ }
+ }
+
+
+
+ /**
+ *
+ * @param cx the rhino context
+ * @param className the class name
+ * @return the compiled class
+ * @throws IOException an i/o related error occurred
+ * @throws ClassNotFoundException class couldn't be found
+ */
+
+ private Class compileClass(Context cx, String className) throws IOException, ClassNotFoundException {
+
+ Class superclass = null;
+ Class[] interfaces = null;
+
+ String file = className.replace('.', '/') + ".js";
+
+ Scriptable target = evaluate(cx, file);
+
+ // first get the base class
+
+ Object ext = ScriptableObject.getProperty(target, "__extends__");
+
+ if (ext instanceof String) {
+ superclass = Class.forName((String) ext);
+ }
+
+ // then add the implemented interfaces
+
+ ArrayList list = new ArrayList();
+
+ Object impl = ScriptableObject.getProperty(target, "__implements__");
+
+ if (impl instanceof NativeArray) {
+
+ NativeArray array = (NativeArray) impl;
+
+ for (int i=0; i<array.getLength(); i++) {
+
+ Object obj = array.get(i, array);
+
+ if (obj instanceof String) {
+
+ list.add(Class.forName((String) obj));
+
+ }
+
+ }
+
+ } else if (impl instanceof String) {
+
+ list.add(Class.forName((String) impl));
+
+ }
+
+
+ if (!list.isEmpty()) {
+
+ interfaces = new Class[list.size()];
+
+ interfaces = (Class[]) list.toArray(interfaces);
+
+ }
+
+ return compileClass(cx, file, className, superclass, interfaces);
+
+ }
+
+
+
+ /**
+ *
+ * @param cx the rhino context
+ * @param file the file to read fom
+ * @param className the class name
+ * @param superclass the super class
+ * @param interfaces the implemented interfaces
+ * @return the compiled class
+ * @throws IOException an i/o related error occured
+ */
+
+ private Class compileClass(Context cx, String file, String className, Class superclass, Class[] interfaces) throws IOException {
+
+ CompilerEnvirons compEnv = new CompilerEnvirons();
+ compEnv.initFromContext(cx);
+ ClassCompiler compiler = new ClassCompiler(compEnv);
+
+ if (superclass != null) {
+ compiler.setTargetExtends(superclass);
+ }
+
+ if (interfaces != null) {
+ compiler.setTargetImplements(interfaces);
+ }
+
+
+ byte[] buf = reader.getBytes(file);
+
+ Object[] classes = compiler.compileToClassFiles(new String(buf), getName(file), 1, className);
+
+ GeneratedClassLoader loader = cx.createClassLoader(cx.getApplicationClassLoader());
+
+ Class clazz = null;
+
+ for (int i = 0; i < classes.length; i += 2) {
+
+ final String clazzName = (String) classes[i];
+ final byte[] clazzBytes = (byte[]) classes[i+1];
+
+ store.write(clazzName.replace('.', '/') + ".class", clazzBytes);
+
+ Class c = loader.defineClass(clazzName, clazzBytes);
+ loader.linkClass(c);
+
+ if (i == 0) {
+ clazz = c;
+ }
+
+ }
+
+ return clazz;
+ }
+
+ private String getName(String s) {
+ final int i = s.lastIndexOf('/');
+ if (i < 0) {
+ return s;
+ }
+
+ return s.substring(i + 1);
+ }
+
+ /**
+ * Evaluate the script on a new Scriptable object.
+ *
+ * @param cx the current Context
+ * @param file the file to evaluate
+ * @return the scriptable object on which the script was evaluated
+ * @throws JavaScriptException if an error occurred evaluating the
+ * prototype script code
+ * @throws IOException if an error occurred reading the script file
+ */
+
+ private Scriptable evaluate(Context cx, String sourcePath) throws JavaScriptException, IOException {
+
+ if (!reader.isAvailable(sourcePath)) {
+ throw new FileNotFoundException("File " + sourcePath + " not found or not readable");
+ }
+
+ final Scriptable target = cx.newObject(scope);
+
+ final byte[] script = reader.getBytes(sourcePath);
+
+ Reader reader = new InputStreamReader(new ByteArrayInputStream(script));
+
+ System.out.println(new String(script));
+
+ cx.evaluateReader(target, reader, getName(sourcePath), 1, null);
+
+ return target;
+ }
+
+}
\ No newline at end of file
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoCompilingClassLoader.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java?view=auto&rev=511677
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java Sun Feb 25 16:47:10 2007
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.commons.jci.compilers;
+
+import org.apache.commons.jci.problems.CompilationProblem;
+import org.apache.commons.jci.readers.ResourceReader;
+import org.apache.commons.jci.stores.ResourceStore;
+import org.apache.commons.jci.utils.ClassUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *
+ * @author tcurdt
+ * based on code from dev.helma.org
+ */
+public final class RhinoJavaCompiler extends AbstractJavaCompiler {
+
+ private final Log log = LogFactory.getLog(RhinoJavaCompiler.class);
+
+ public CompilationResult compile( final String[] pResourcePaths, final ResourceReader pReader, final ResourceStore pStore, final ClassLoader classLoader) {
+
+ final RhinoCompilingClassLoader cl = new RhinoCompilingClassLoader(pReader, pStore, classLoader);
+
+
+ for (int i = 0; i < pResourcePaths.length; i++) {
+ log.debug("compiling " + pResourcePaths[i]);
+
+ final String clazzName = ClassUtils.convertResourceToClassName(pResourcePaths[i]);
+ try {
+ cl.loadClass(clazzName);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ return new CompilationResult(new CompilationProblem[0]);
+ }
+
+}
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/main/java/org/apache/commons/jci/compilers/RhinoJavaCompiler.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java?view=auto&rev=511677
==============================================================================
--- jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java (added)
+++ jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java Sun Feb 25 16:47:10 2007
@@ -0,0 +1,65 @@
+package org.apache.commons.jci.compilers;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.jci.readers.ResourceReader;
+import org.apache.commons.jci.stores.MemoryResourceStore;
+
+public final class RhinoJavaCompilerTestCase extends AbstractCompilerTestCase {
+
+ public JavaCompiler createJavaCompiler() {
+ return new RhinoJavaCompiler();
+ }
+
+ public String getCompilerName() {
+ return "rhino";
+ }
+
+ public void testSimpleCompile() throws Exception {
+ final JavaCompiler compiler = createJavaCompiler();
+
+ final ResourceReader reader = new ResourceReader() {
+ final private Map sources = new HashMap() {{
+ put("jci/Simple.js", (
+ " var i = 0;\n" +
+ "\n"
+ ).getBytes());
+ }};
+
+ public byte[] getBytes( final String pResourceName ) {
+ return (byte[]) sources.get(pResourceName);
+ }
+
+ public boolean isAvailable( final String pResourceName ) {
+ return sources.containsKey(pResourceName);
+ }
+
+ };
+
+ final MemoryResourceStore store = new MemoryResourceStore();
+ final CompilationResult result = compiler.compile(
+ new String[] {
+ "jci/Simple.js"
+ }, reader, store);
+
+ assertEquals(toString(result.getErrors()), 0, result.getErrors().length);
+ assertEquals(toString(result.getWarnings()), 0, result.getWarnings().length);
+
+ final byte[] clazzBytes = store.read("jci/Simple.class");
+ assertNotNull(clazzBytes);
+ assertTrue(clazzBytes.length > 0);
+ }
+
+ public void testExtendedCompile() throws Exception {
+ }
+
+ public void testInternalClassCompile() throws Exception {
+ }
+
+ public void testUppercasePackageNameCompile() throws Exception {
+ }
+
+
+
+}
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: jakarta/commons/sandbox/jci/trunk/compilers/rhino/src/test/java/org/apache/commons/jci/compilers/RhinoJavaCompilerTestCase.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org