Author: musachy
Date: Thu Jul 30 19:23:24 2009
New Revision: 799418

URL: http://svn.apache.org/viewvc?rev=799418&view=rev
Log:
import jsp plugin

Added:
    struts/sandbox/trunk/struts2-jsp-plugin/
    struts/sandbox/trunk/struts2-jsp-plugin/pom.xml
    struts/sandbox/trunk/struts2-jsp-plugin/src/
    struts/sandbox/trunk/struts2-jsp-plugin/src/main/
    struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/
    struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/
    struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/
    struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/
    
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/EmbeddedJSPResult.java
    
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPLoader.java
    
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPServletConfig.java
    
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/ServletCache.java
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/
    
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/
    struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/
    
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/
    
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp
    
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/simple0.jsp

Added: struts/sandbox/trunk/struts2-jsp-plugin/pom.xml
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/pom.xml?rev=799418&view=auto
==============================================================================
--- struts/sandbox/trunk/struts2-jsp-plugin/pom.xml (added)
+++ struts/sandbox/trunk/struts2-jsp-plugin/pom.xml Thu Jul 30 19:23:24 2009
@@ -0,0 +1,56 @@
+<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>
+    <groupId>struts2-jsp-plugin</groupId>
+    <artifactId>struts2-jsp-plugin</artifactId>
+    <packaging>jar</packaging>
+    <version>1.0</version>
+    <name>struts2-jsp-plugin</name>
+    <url>http://maven.apache.org</url>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>3.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>2.5.6</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>2.5.6</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.3.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.struts</groupId>
+            <artifactId>struts2-core</artifactId>
+            <version>2.1.8-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.opensymphony</groupId>
+            <artifactId>xwork-core</artifactId>
+            <version>2.1.5-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>tomcat</groupId>
+            <artifactId>jasper-compiler</artifactId>
+            <version>5.5.23</version>
+        </dependency>
+        <dependency>
+            <groupId>tomcat</groupId>
+            <artifactId>jasper-runtime</artifactId>
+            <version>5.5.23</version>
+        </dependency>
+    </dependencies>
+</project>

Added: 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/EmbeddedJSPResult.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/EmbeddedJSPResult.java?rev=799418&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/EmbeddedJSPResult.java
 (added)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/EmbeddedJSPResult.java
 Thu Jul 30 19:23:24 2009
@@ -0,0 +1,47 @@
+package org.apache.struts;
+
+import org.apache.struts2.dispatcher.StrutsResultSupport;
+import org.apache.struts2.ServletActionContext;
+import org.apache.commons.lang.xwork.StringUtils;
+import org.apache.jasper.JspC;
+import org.apache.jasper.JasperException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.BuildEvent;
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.util.ClassLoaderUtil;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+
+import javax.servlet.jsp.JspPage;
+import javax.servlet.jsp.HttpJspPage;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.ServletException;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import java.io.*;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.FileChannel;
+import java.nio.ByteBuffer;
+import java.net.URLClassLoader;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+public class EmbeddedJSPResult extends StrutsResultSupport {
+    private static final Logger LOG = 
LoggerFactory.getLogger(EmbeddedJSPResult.class);
+
+    //maps from jsp path -> pagelet
+    private static final ServletCache servletCache = new 
ServletCache(ServletActionContext.getServletContext());
+
+    protected void doExecute(String finalLocation, ActionInvocation 
invocation) throws Exception {
+        Servlet servlet = servletCache.get(finalLocation);  
+        HttpJspPage page = (HttpJspPage) servlet;
+        page.jspInit();
+        page._jspService(ServletActionContext.getRequest(), 
ServletActionContext.getResponse());
+    }
+}

Added: 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPLoader.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPLoader.java?rev=799418&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPLoader.java
 (added)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPLoader.java
 Thu Jul 30 19:23:24 2009
@@ -0,0 +1,192 @@
+/*
+ * $Id$
+ *
+ * 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.struts;
+
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import com.opensymphony.xwork2.util.ClassLoaderUtil;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.jsp.HttpJspPage;
+import java.io.*;
+import java.net.URLClassLoader;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.Channels;
+import java.nio.channels.FileChannel;
+import java.nio.ByteBuffer;
+
+import org.apache.commons.lang.xwork.StringUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.jasper.JasperException;
+import org.apache.jasper.JspC;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+
+/**
+ * Uses jasper to extract a JSP from the classpath to a file and compile it
+ */
+public class JSPLoader implements BuildListener {
+    private static final Logger LOG = LoggerFactory.getLogger(JSPLoader.class);
+    public static final File JSP_DIR = new 
File(System.getProperty("java.io.tmpdir"), "struts_jsps");
+
+    private static ClassLoader classLoader;
+    private static final String DEFAULT_NAMESPACE = "org.apache.jsp";
+    private static final String DEFAULT_PATH = "org/apache/jsp";
+
+    static {
+        try {
+            classLoader = new URLClassLoader(new 
URL[]{JSP_DIR.toURI().toURL()});
+        } catch (MalformedURLException e) {
+            //this is kinda dumb
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Servlet load(String location, ServletContext servletContext) throws 
Exception {
+        File jspFile = extractFile(location);
+        File classFile = compileJSP(jspFile);
+        Class clazz = loadClass(classFile);
+        return createServlet(clazz, servletContext);
+    }
+
+    /**
+     * Creates and inits a servlet
+     */
+    private Servlet createServlet(Class clazz, ServletContext servletContext) 
throws IllegalAccessException, InstantiationException, ServletException {
+        Servlet servlet = (Servlet) clazz.newInstance();
+        JSPServletConfig config = new JSPServletConfig(servletContext);
+        servlet.init(config);
+
+        return servlet;
+    }
+
+    private Class loadClass(File file) throws ClassNotFoundException {
+        StringBuilder sb = new StringBuilder(DEFAULT_NAMESPACE);
+        sb.append(".");
+        sb.append(StringUtils.substringBefore(file.getName(), "."));
+        return classLoader.loadClass(sb.toString());
+    }
+
+    private File compileJSP(File file) throws JasperException {
+        //ant setup
+        Project project = new Project();
+        project.addBuildListener(this);
+
+        File parentFile = file.getParentFile();
+        String parentPath = parentFile.getAbsolutePath();
+
+        JspC jspC = new JspC();
+        jspC.setProject(project);
+        jspC.setOutputDir(parentPath);
+        jspC.setCompile(true);
+        jspC.setJspFiles(file.getName());
+        jspC.setUriroot(parentPath);
+        jspC.execute();
+
+        String classFileName = file.getName().replace(".jsp", "_jsp.class");
+        return new File(parentFile, DEFAULT_PATH + "/" + classFileName);
+    }
+
+    /**
+     * Looks up a file with path finalLocation from the classpath and extracts 
it to a temporal file
+     */
+    public File extractFile(String finalLocation) throws IOException {
+        InputStream inputStream = 
ClassLoaderUtil.getResourceAsStream(finalLocation, EmbeddedJSPResult.class);
+
+        if (inputStream == null)
+            throw new FileNotFoundException("Unable to find file [" +
+                    finalLocation
+                    + "] in the classpath");
+
+        FileOutputStream jspOutputStream = null;
+
+        try {
+            ReadableByteChannel readableByteChannel = 
Channels.newChannel(inputStream);
+
+            //file name and path
+            String[] splitted = finalLocation.split("\\.|/");
+            String path = StringUtils.substringBeforeLast(finalLocation, "/");
+            String fileName = StringUtils.substringAfterLast(finalLocation, 
"/");
+
+
+            //create output dir
+            if (!JSP_DIR.exists())
+                JSP_DIR.mkdirs();
+
+            //temp file
+            File jspFile = new File(JSP_DIR, fileName);
+
+            //output channel
+            jspOutputStream = new FileOutputStream(jspFile);
+            FileChannel outChannel = jspOutputStream.getChannel();
+
+            ByteBuffer buffer = ByteBuffer.allocate(1024);
+
+            //copy
+            while (true) {
+                int read = readableByteChannel.read(buffer);
+
+                if (read == -1)
+                    break;
+
+                buffer.flip();
+                outChannel.write(buffer);
+                buffer.clear();
+            }
+
+            return jspFile;
+        } finally {
+            if (inputStream != null)
+                inputStream.close();
+            if (jspOutputStream != null)
+                jspOutputStream.close();
+        }
+    }
+
+    public void buildStarted(BuildEvent buildEvent) {
+    }
+
+    public void buildFinished(BuildEvent buildEvent) {
+    }
+
+    public void targetStarted(BuildEvent buildEvent) {
+    }
+
+    public void targetFinished(BuildEvent buildEvent) {
+    }
+
+    public void taskStarted(BuildEvent buildEvent) {
+    }
+
+    public void taskFinished(BuildEvent buildEvent) {
+    }
+
+    public void messageLogged(BuildEvent buildEvent) {
+        LOG.debug(buildEvent.getMessage());
+    }
+}

Added: 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPServletConfig.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPServletConfig.java?rev=799418&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPServletConfig.java
 (added)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/JSPServletConfig.java
 Thu Jul 30 19:23:24 2009
@@ -0,0 +1,52 @@
+/*
+ * $Id$
+ *
+ * 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.struts;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import java.util.Enumeration;
+import java.util.Collections;
+
+public class JSPServletConfig implements ServletConfig {
+    private final Enumeration EMPTY_ENUMERATION = 
Collections.enumeration(Collections.EMPTY_LIST);
+
+    private ServletContext servletContext;
+
+    public JSPServletConfig(ServletContext servletContext) {
+        this.servletContext = servletContext;
+    }
+
+    public String getInitParameter(String name) {
+        return null;  
+    }
+
+    public Enumeration getInitParameterNames() {
+        return EMPTY_ENUMERATION;
+    }
+
+    public ServletContext getServletContext() {
+        return servletContext;
+    }
+
+    public String getServletName() {
+        return null;  
+    }
+}

Added: 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/ServletCache.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/ServletCache.java?rev=799418&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/ServletCache.java
 (added)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/main/java/org/apache/struts/ServletCache.java
 Thu Jul 30 19:23:24 2009
@@ -0,0 +1,78 @@
+/*
+ * $Id$
+ *
+ * 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.struts;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import java.util.concurrent.*;
+
+/**
+ * Caches servlet instances by jsp location
+ */
+public class ServletCache {
+    private final ConcurrentMap<String, Future<Servlet>> cache
+            = new ConcurrentHashMap<String, Future<Servlet>>();
+
+    private final JSPLoader jspLoader = new JSPLoader();
+
+    private final ServletContext servletContext;
+
+    public ServletCache(ServletContext servletContext) {
+        this.servletContext = servletContext;
+    }
+
+    public Servlet get(final String location) throws InterruptedException {
+        while (true) {
+            Future<Servlet> future = cache.get(location);
+            if (future == null) {
+                Callable<Servlet> loadJSPCallable = new Callable<Servlet>() {
+                    public Servlet call() throws Exception {
+                        return jspLoader.load(location, servletContext);
+                    }
+                };
+                FutureTask<Servlet> futureTask = new 
FutureTask<Servlet>(loadJSPCallable);
+                future = cache.putIfAbsent(location, futureTask);
+                if (future == null) {
+                    future = futureTask;
+                    futureTask.run();
+                }
+            }
+            try {
+                return future.get();
+            } catch (CancellationException e) {
+                cache.remove(location, future);
+            } catch (ExecutionException e) {
+                throw launderThrowable(e.getCause());
+            }
+        }
+    }
+
+    public static RuntimeException launderThrowable(Throwable t) {
+        if (t instanceof RuntimeException)
+            return (RuntimeException) t;
+        else if (t instanceof Error)
+            throw (Error) t;
+        else
+            throw new IllegalStateException("Not unchecked", t);
+    }
+
+}
+

Added: 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java?rev=799418&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
 (added)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/java/org/apache/struts2/EmbeddedJSPResultTest.java
 Thu Jul 30 19:23:24 2009
@@ -0,0 +1,44 @@
+package org.apache.struts2;
+
+import junit.framework.TestCase;
+import org.apache.commons.io.FileUtils;
+import org.apache.struts.EmbeddedJSPResult;
+import org.apache.struts.JSPLoader;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.mock.web.MockServletContext;
+import com.opensymphony.xwork2.ActionContext;
+
+import java.util.HashMap;
+
+public class EmbeddedJSPResultTest extends TestCase {
+
+
+    public void testSimple() throws Exception {
+        //mock objects
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+        MockServletContext context = new MockServletContext();
+
+        ActionContext actionContext = new ActionContext(new HashMap<String, 
Object>());
+        ActionContext.setContext(actionContext);
+        ServletActionContext.setRequest(request);
+        ServletActionContext.setResponse(response);
+        ServletActionContext.setServletContext(context);
+
+        EmbeddedJSPResult result = new EmbeddedJSPResult();
+
+        result.setLocation("org/apache/struts2/simple0.jsp");
+        result.execute(null);
+
+        assertEquals("hello", response.getContentAsString());
+    }
+
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        if (JSPLoader.JSP_DIR.exists())
+            FileUtils.forceDelete(JSPLoader.JSP_DIR);
+    }
+}

Added: 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp?rev=799418&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp
 (added)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/includes0.jsp
 Thu Jul 30 19:23:24 2009
@@ -0,0 +1,2 @@
+<jsp:include page="simple0.jsp" />
+Test
\ No newline at end of file

Added: 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/simple0.jsp
URL: 
http://svn.apache.org/viewvc/struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/simple0.jsp?rev=799418&view=auto
==============================================================================
--- 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/simple0.jsp
 (added)
+++ 
struts/sandbox/trunk/struts2-jsp-plugin/src/test/resources/org/apache/struts2/simple0.jsp
 Thu Jul 30 19:23:24 2009
@@ -0,0 +1 @@
+hello
\ No newline at end of file


Reply via email to