You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2008/08/20 17:22:11 UTC

svn commit: r687373 [2/2] - in /incubator/sling/trunk: ./ scripting/java/ scripting/java/src/ scripting/java/src/main/ scripting/java/src/main/java/ scripting/java/src/main/java/org/ scripting/java/src/main/java/org/apache/ scripting/java/src/main/java...

Added: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/SlingIOProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/SlingIOProvider.java?rev=687373&view=auto
==============================================================================
--- incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/SlingIOProvider.java (added)
+++ incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/SlingIOProvider.java Wed Aug 20 08:22:10 2008
@@ -0,0 +1,369 @@
+/*
+ * 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.sling.scripting.java;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.sling.api.SlingException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceMetadata;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The <code>SlingIOProvider</code> TODO
+ */
+public class SlingIOProvider  {
+
+    /** default log */
+    private static final Logger log = LoggerFactory.getLogger(SlingIOProvider.class);
+
+    private final SlingRepository repository;
+
+    private ThreadLocal<ResourceResolver> requestResourceResolver;
+
+    // private session for write access
+    private ThreadLocal<Session> privateSession;
+
+    SlingIOProvider(SlingRepository repository) {
+        this.repository = repository;
+        this.requestResourceResolver = new ThreadLocal<ResourceResolver>();
+        this.privateSession = new ThreadLocal<Session>();
+    }
+
+    void setRequestResourceResolver(ResourceResolver resolver) {
+        requestResourceResolver.set(resolver);
+    }
+
+    void resetRequestResourceResolver() {
+        requestResourceResolver.remove();
+
+        // at the same time logout this thread's session
+        Session session = privateSession.get();
+        if (session != null) {
+            if (session.isLive()) {
+                session.logout();
+            }
+            privateSession.remove();
+        }
+    }
+
+    // ---------- IOProvider interface -----------------------------------------
+
+    /**
+     * Returns an InputStream for the file name which is looked up with the
+     * ResourceProvider and retrieved from the Resource if the StreamProvider
+     * interface is implemented.
+     */
+    public InputStream getInputStream(String fileName)
+    throws FileNotFoundException, IOException {
+
+        try {
+
+            Resource resource = getResourceInternal(fileName);
+            if (resource == null) {
+                throw new FileNotFoundException("Cannot find " + fileName);
+            }
+
+            InputStream stream = resource.adaptTo(InputStream.class);
+            if (stream == null) {
+                throw new FileNotFoundException("Cannot find " + fileName);
+            }
+
+            return stream;
+
+        } catch (SlingException se) {
+            throw (IOException) new IOException(
+                "Failed to get InputStream for " + fileName).initCause(se);
+        }
+    }
+
+    /**
+     * Returns the value of the last modified meta data field of the resource
+     * found at file name or zero if the meta data field is not set. If the
+     * resource does not exist or an error occurrs finding the resource, -1 is
+     * returned.
+     */
+    public long lastModified(String fileName) {
+        try {
+            Resource resource = getResourceInternal(fileName);
+            if (resource != null) {
+                ResourceMetadata meta = resource.getResourceMetadata();
+                long modTime = meta.getModificationTime();
+                return (modTime > 0) ? modTime : 0;
+            }
+
+        } catch (SlingException se) {
+            log.error("Cannot get last modification time for " + fileName, se);
+        }
+
+        // fallback to "non-existant" in case of problems
+        return -1;
+    }
+
+    /**
+     * Removes the named item from the repository.
+     */
+    public boolean delete(String fileName) {
+        Node parentNode = null;
+        try {
+            fileName = cleanPath(fileName);
+            Session session = getPrivateSession();
+            if (session.itemExists(fileName)) {
+                Item fileItem = session.getItem(fileName);
+                parentNode = fileItem.getParent();
+                fileItem.remove();
+                parentNode.save();
+                return true;
+            }
+        } catch (RepositoryException re) {
+            log.error("Cannot remove " + fileName, re);
+        } finally {
+            checkNode(parentNode, fileName);
+        }
+
+        // fall back to false if item does not exist or in case of error
+        return false;
+    }
+
+    /**
+     * Returns an output stream to write to the repository.
+     */
+    public OutputStream getOutputStream(String fileName) {
+        fileName = cleanPath(fileName);
+        return new RepositoryOutputStream(this, fileName);
+    }
+
+    /* package */URL getURL(String path) throws MalformedURLException {
+        try {
+            Resource resource = getResourceInternal(path);
+            return (resource != null) ? resource.adaptTo(URL.class) : null;
+        } catch (SlingException se) {
+            throw (MalformedURLException) new MalformedURLException(
+                "Cannot get URL for " + path).initCause(se);
+        }
+    }
+
+    /* package */Set<String> getResourcePaths(String path) {
+        Set<String> paths = new HashSet<String>();
+
+        ResourceResolver resolver = requestResourceResolver.get();
+        if (resolver != null) {
+            try {
+                Resource resource = resolver.getResource(cleanPath(path));
+                if (resource != null) {
+                    Iterator<Resource> entries = resolver.listChildren(resource);
+                    while (entries.hasNext()) {
+                        paths.add(entries.next().getPath());
+                    }
+                }
+            } catch (SlingException se) {
+                log.warn("getResourcePaths: Cannot list children of " + path,
+                    se);
+            }
+        }
+
+        return paths.isEmpty() ? null : paths;
+    }
+
+    private Resource getResourceInternal(String path) throws SlingException {
+        ResourceResolver resolver = requestResourceResolver.get();
+        if (resolver != null) {
+            return resolver.getResource(cleanPath(path));
+        }
+
+        return null;
+    }
+
+    // ---------- internal -----------------------------------------------------
+
+    private Session getPrivateSession() throws RepositoryException {
+        Session session = privateSession.get();
+        if (session == null) {
+            session = repository.loginAdministrative(null);
+            privateSession.set(session);
+        }
+
+        return session;
+    }
+
+    private static void checkNode(Node node, String path) {
+        if (node != null && node.isModified()) {
+            try {
+                node.refresh(false);
+            } catch (RepositoryException re) {
+                log.error("Cannot refresh node for " + path
+                    + " after failed save", re);
+            }
+        }
+    }
+
+    private String cleanPath(String path) {
+        // replace backslash by slash
+        path = path.replace('\\', '/');
+
+        // cut off trailing slash
+        while (path.endsWith("/")) {
+            path = path.substring(0, path.length() - 1);
+        }
+
+        return path;
+    }
+
+    private static class RepositoryOutputStream extends ByteArrayOutputStream {
+
+        private final SlingIOProvider repositoryOutputProvider;
+
+        private final String fileName;
+
+        RepositoryOutputStream(SlingIOProvider repositoryOutputProvider,
+                String fileName) {
+            this.repositoryOutputProvider = repositoryOutputProvider;
+            this.fileName = fileName;
+        }
+
+        public void close() throws IOException {
+            super.close();
+
+            Node parentNode = null;
+            try {
+                Session session = repositoryOutputProvider.getPrivateSession();
+                Node fileNode = null;
+                Node contentNode = null;
+                if (session.itemExists(fileName)) {
+                    Item item = session.getItem(fileName);
+                    if (item.isNode()) {
+                        Node node = item.isNode()
+                                ? (Node) item
+                                : item.getParent();
+                        if ("jcr:content".equals(node.getName())) {
+                            // replace the content properties of the jcr:content
+                            // node
+                            parentNode = node;
+                            contentNode = node;
+                        } else if (node.isNodeType("nt:file")) {
+                            // try to set the content properties of jcr:content
+                            // node
+                            parentNode = node;
+                            contentNode = node.getNode("jcr:content");
+                        } else { // fileName is a node
+                            // try to set the content properties of the node
+                            parentNode = node;
+                            contentNode = node;
+                        }
+                    } else {
+                        // replace property with an nt:file node (if possible)
+                        parentNode = item.getParent();
+                        String name = item.getName();
+                        fileNode = parentNode.addNode(name, "nt:file");
+                        item.remove();
+                    }
+                } else {
+                    fileNode = createPath(fileName, "nt:folder", "nt:file", session);
+                    parentNode = session.getRootNode();
+                }
+
+                // if we have a file node, create the contentNode
+                if (fileNode != null) {
+                    contentNode = fileNode.addNode("jcr:content", "nt:resource");
+                }
+
+                contentNode.setProperty("jcr:lastModified",
+                    System.currentTimeMillis());
+                contentNode.setProperty("jcr:data", new ByteArrayInputStream(
+                    buf, 0, size()));
+                contentNode.setProperty("jcr:mimeType",
+                    "application/octet-stream");
+
+                parentNode.save();
+            } catch (RepositoryException re) {
+                log.error("Cannot write file " + fileName, re);
+                throw new IOException("Cannot write file " + fileName
+                    + ", reason: " + re.toString());
+            } finally {
+                checkNode(parentNode, fileName);
+            }
+        }
+    }
+
+    /**
+     * Creates or gets the {@link javax.jcr.Node Node} at the given Path.
+     * In case it has to create the Node all non-existent intermediate path-elements
+     * will be create with the given intermediate node type and the returned node
+     * will be created with the given nodeType
+     *
+     * @param path to create
+     * @param intermediateNodeType to use for creation of intermediate nodes
+     * @param nodeType to use for creation of the final node
+     * @param session to use
+     * @return the Node at path
+     * @throws RepositoryException in case of exception accessing the Repository
+     */
+    private static Node createPath(String path,
+                                  String intermediateNodeType,
+                                  String nodeType,
+                                  Session session)
+            throws RepositoryException {
+        if (path == null || path.length() == 0 || "/".equals(path)) {
+            return session.getRootNode();
+        } else if (!session.itemExists(path)) {
+            Node node = session.getRootNode();
+            path = path.substring(1);
+            int pos = path.lastIndexOf('/');
+            if ( pos != -1 ) {
+                final StringTokenizer st = new StringTokenizer(path.substring(0, pos), "/");
+                while ( st.hasMoreTokens() ) {
+                    final String token = st.nextToken();
+                    if ( !node.hasNode(token) ) {
+                        try {
+                            node.addNode(token, intermediateNodeType);
+                        } catch (RepositoryException re) {
+                            // we ignore this as this folder might be created from a different task
+                            node.refresh(false);
+                        }
+                    }
+                    node = node.getNode(token);
+                }
+                path = path.substring(pos + 1);
+            }
+            if ( !node.hasNode(path) ) {
+                node.addNode(path, nodeType);
+            }
+            return node.getNode(path);
+        } else {
+            return (Node) session.getItem(path);
+        }
+    }
+}

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/SlingIOProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/SlingIOProvider.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/SlingIOProvider.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/CompilationUnit.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/CompilationUnit.java?rev=687373&view=auto
==============================================================================
--- incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/CompilationUnit.java (added)
+++ incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/CompilationUnit.java Wed Aug 20 08:22:10 2008
@@ -0,0 +1,282 @@
+/*
+ * 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.sling.scripting.java.jdt;
+
+import java.io.BufferedOutputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.apache.sling.scripting.java.CompilerError;
+import org.apache.sling.scripting.java.Options;
+import org.apache.sling.scripting.java.SlingIOProvider;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.compiler.ClassFile;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
+import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
+import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
+
+
+public class CompilationUnit
+    implements ICompilationUnit, INameEnvironment, ICompilerRequestor {
+
+    private final Options options;
+    private final SlingIOProvider ioProvider;
+    private final String className;
+    private final String sourceFile;
+
+    /** The list of compile errors. */
+    private final List<CompilerError> errors = new LinkedList<CompilerError>();
+
+    public CompilationUnit(String sourceFile,
+                           String className,
+                           Options options,
+                           SlingIOProvider ioProvider) {
+        this.className = className;
+        this.sourceFile = sourceFile;
+        this.ioProvider = ioProvider;
+        this.options = options;
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.IDependent#getFileName()
+     */
+    public char[] getFileName() {
+        return className.concat(".java").toCharArray();
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.ICompilationUnit#getContents()
+     */
+    public char[] getContents() {
+        char[] result = null;
+        InputStream fr = null;
+        try {
+            fr = ioProvider.getInputStream(this.sourceFile);
+            final Reader reader = new BufferedReader(new InputStreamReader(fr, this.options.getJavaEncoding()));
+            try {
+                char[] chars = new char[8192];
+                StringBuffer buf = new StringBuffer();
+                int count;
+                while ((count = reader.read(chars, 0, chars.length)) > 0) {
+                    buf.append(chars, 0, count);
+                }
+                result = new char[buf.length()];
+                buf.getChars(0, result.length, result, 0);
+            } finally {
+                reader.close();
+            }
+        } catch (IOException e) {
+            handleError(-1, -1, e.getMessage());
+        }
+        return result;
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.ICompilationUnit#getMainTypeName()
+     */
+    public char[] getMainTypeName() {
+        int dot = className.lastIndexOf('.');
+        if (dot > 0) {
+            return className.substring(dot + 1).toCharArray();
+        }
+        return className.toCharArray();
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.ICompilationUnit#getPackageName()
+     */
+    public char[][] getPackageName() {
+        StringTokenizer izer = new StringTokenizer(className.replace('/', '.'), ".");
+        char[][] result = new char[izer.countTokens()-1][];
+        for (int i = 0; i < result.length; i++) {
+            String tok = izer.nextToken();
+            result[i] = tok.toCharArray();
+        }
+        return result;
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.INameEnvironment#findType(char[][])
+     */
+    public NameEnvironmentAnswer findType(char[][] compoundTypeName) {
+        StringBuffer result = new StringBuffer();
+        for (int i = 0; i < compoundTypeName.length; i++) {
+            if (i > 0) {
+                result.append(".");
+            }
+            result.append(compoundTypeName[i]);
+        }
+        return findType(result.toString());
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.INameEnvironment#findType(char[], char[][])
+     */
+    public NameEnvironmentAnswer findType(char[] typeName, char[][] packageName) {
+        StringBuffer result = new StringBuffer();
+        for (int i = 0; i < packageName.length; i++) {
+            if (i > 0) {
+                result.append(".");
+            }
+            result.append(packageName[i]);
+        }
+        result.append(".");
+        result.append(typeName);
+        return findType(result.toString());
+    }
+
+    /**
+     * @param className
+     * @return
+     */
+    private NameEnvironmentAnswer findType(String className) {
+        try {
+            if (className.equals(this.className)) {
+                ICompilationUnit compilationUnit = this;
+                return new NameEnvironmentAnswer(compilationUnit, null);
+            }
+            String resourceName = className.replace('.', '/') + ".class";
+            InputStream is = options.getClassLoader().getResourceAsStream(resourceName);
+            if (is != null) {
+                byte[] classBytes;
+                byte[] buf = new byte[8192];
+                ByteArrayOutputStream baos =
+                    new ByteArrayOutputStream(buf.length);
+                int count;
+                while ((count = is.read(buf, 0, buf.length)) > 0) {
+                    baos.write(buf, 0, count);
+                }
+                baos.flush();
+                classBytes = baos.toByteArray();
+                char[] fileName = className.toCharArray();
+                ClassFileReader classFileReader =
+                    new ClassFileReader(classBytes, fileName,
+                                        true);
+                return
+                    new NameEnvironmentAnswer(classFileReader, null);
+            }
+        } catch (IOException exc) {
+            handleError(-1, -1, exc.getMessage());
+        } catch (org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException exc) {
+            handleError(-1, -1, exc.getMessage());
+        }
+        return null;
+    }
+
+    private boolean isPackage(String result) {
+        if (result.equals(this.className)) {
+            return false;
+        }
+        String resourceName = result.replace('.', '/') + ".class";
+        InputStream is = options.getClassLoader().getResourceAsStream(resourceName);
+        return is == null;
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.INameEnvironment#isPackage(char[][], char[])
+     */
+    public boolean isPackage(char[][] parentPackageName, char[] packageName) {
+        StringBuffer result = new StringBuffer();
+        if (parentPackageName != null) {
+            for (int i = 0; i < parentPackageName.length; i++) {
+                if (i > 0) {
+                    result.append(".");
+                }
+                result.append(parentPackageName[i]);
+            }
+        }
+        String str = new String(packageName);
+        if (Character.isUpperCase(str.charAt(0)) && !isPackage(result.toString())) {
+                return false;
+        }
+        result.append(".");
+        result.append(str);
+        return isPackage(result.toString());
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.env.INameEnvironment#cleanup()
+     */
+    public void cleanup() {
+        // EMPTY
+    }
+
+    /**
+     * @see org.eclipse.jdt.internal.compiler.ICompilerRequestor#acceptResult(org.eclipse.jdt.internal.compiler.CompilationResult)
+     */
+    public void acceptResult(CompilationResult result) {
+        try {
+            if (result.hasErrors()) {
+                IProblem[] errors = result.getErrors();
+                for (int i = 0; i < errors.length; i++) {
+                    IProblem error = errors[i];
+                    handleError(error.getSourceLineNumber(), -1, error.getMessage());
+                }
+            } else {
+                ClassFile[] classFiles = result.getClassFiles();
+                for (int i = 0; i < classFiles.length; i++) {
+                    ClassFile classFile = classFiles[i];
+                    char[][] compoundName = classFile.getCompoundName();
+                    StringBuffer className = new StringBuffer();
+                    for (int j = 0;  j < compoundName.length; j++) {
+                        if (j > 0) {
+                            className.append(".");
+                        }
+                        className.append(compoundName[j]);
+                    }
+                    byte[] bytes = classFile.getBytes();
+                    final StringBuffer b = new StringBuffer(this.options.getDestinationPath());
+                    b.append('/');
+                    b.append(className.toString().replace('.', '/'));
+                    b.append(".class");
+                    OutputStream fout = ioProvider.getOutputStream(b.toString());
+                    BufferedOutputStream bos = new BufferedOutputStream(fout);
+                    bos.write(bytes);
+                    bos.close();
+                }
+            }
+        } catch (IOException exc) {
+            exc.printStackTrace();
+        }
+    }
+
+    private void handleError(int line, int column, Object errorMessage) {
+        if (column < 0) column = 0;
+        errors.add(new CompilerError(this.sourceFile,
+                                     true,
+                                     line,
+                                     column,
+                                     line,
+                                     column,
+                                     errorMessage.toString()));
+    }
+
+    public List<CompilerError> getErrors() throws IOException {
+        return errors;
+    }
+}

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/CompilationUnit.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/CompilationUnit.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/CompilationUnit.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/EclipseJavaCompiler.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/EclipseJavaCompiler.java?rev=687373&view=auto
==============================================================================
--- incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/EclipseJavaCompiler.java (added)
+++ incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/EclipseJavaCompiler.java Wed Aug 20 08:22:10 2008
@@ -0,0 +1,118 @@
+/*
+ * 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.sling.scripting.java.jdt;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.sling.scripting.java.CompilationContext;
+import org.apache.sling.scripting.java.CompilerError;
+import org.apache.sling.scripting.java.Options;
+import org.apache.sling.scripting.java.SlingIOProvider;
+import org.eclipse.jdt.internal.compiler.Compiler;
+import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
+import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
+import org.eclipse.jdt.internal.compiler.IProblemFactory;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
+
+/**
+ * Eclipse Java Compiler
+ *
+ * @version $Id$
+ */
+public class EclipseJavaCompiler {
+
+    /** The io provider. */
+    private final SlingIOProvider ioProvider;
+
+    /** The compiler options. */
+    private final Options compilerOptions;
+
+    /** The compilation context. */
+    private final CompilationContext context;
+
+    /**
+     * Construct a new java compiler.
+     * @param context
+     */
+    public EclipseJavaCompiler(final CompilationContext context) {
+        this.ioProvider = context.getIOProvider();
+        this.compilerOptions = context.getCompilerOptions();
+        this.context = context;
+    }
+
+    private CompilerOptions getCompilerOptions() {
+        CompilerOptions options = new CompilerOptions();
+        final Map<String, String> settings = new HashMap<String, String>();
+        settings.put(CompilerOptions.OPTION_LineNumberAttribute,
+                CompilerOptions.GENERATE);
+        settings.put(CompilerOptions.OPTION_SourceFileAttribute,
+                CompilerOptions.GENERATE);
+        settings.put(CompilerOptions.OPTION_ReportDeprecation,
+                CompilerOptions.IGNORE);
+        settings.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.IGNORE);
+        settings.put(CompilerOptions.OPTION_Encoding, this.compilerOptions.getJavaEncoding());
+        if (this.compilerOptions.getClassDebugInfo()) {
+            settings.put(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.GENERATE);
+        }
+        if ( this.compilerOptions.getCompilerSourceVM().equals("1.6") ) {
+            settings.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_6);
+        } else {
+            settings.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
+        }
+        if ( this.compilerOptions.getCompilerTargetVM().equals("1.6") ) {
+            settings.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_6);
+            settings.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_6);
+        } else {
+            settings.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5);
+            settings.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
+        }
+
+        options.set(settings);
+        return options;
+    }
+
+    /**
+     * Compile the java class.
+     * @return null if no error occured, a list of errors otherwise.
+     * @throws IOException
+     */
+    public List<CompilerError> compile() throws IOException {
+        final IErrorHandlingPolicy policy = DefaultErrorHandlingPolicies.proceedWithAllProblems();
+        final IProblemFactory problemFactory = new DefaultProblemFactory(Locale.getDefault());
+        final CompilationUnit unit = new CompilationUnit(this.context.getSourcePath(),
+                 this.context.getJavaClassName(),
+                 this.context.getCompilerOptions(),
+                 this.ioProvider);
+
+        final Compiler compiler = new Compiler(unit,
+                                         policy,
+                                         getCompilerOptions(),
+                                         unit,
+                                         problemFactory);
+        compiler.compile(new CompilationUnit[] {unit});
+        if ( unit.getErrors().size() == 0 ) {
+            return null;
+        }
+        return unit.getErrors();
+    }
+
+}

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/EclipseJavaCompiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/EclipseJavaCompiler.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: incubator/sling/trunk/scripting/java/src/main/java/org/apache/sling/scripting/java/jdt/EclipseJavaCompiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain