| /* |
| * $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.struts2.showcase.source; |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.servlet.ServletContext; |
| |
| import org.apache.struts2.util.ServletContextAware; |
| |
| import com.opensymphony.xwork2.ActionSupport; |
| import com.opensymphony.xwork2.util.ClassLoaderUtil; |
| |
| /** |
| * Processes configuration, page, and action class paths to create snippets |
| * of the files for display. |
| */ |
| public class ViewSourceAction extends ActionSupport implements ServletContextAware { |
| |
| private String page; |
| private String className; |
| private String config; |
| |
| private List pageLines; |
| private List classLines; |
| private List configLines; |
| |
| private int configLine; |
| private int padding = 10; |
| |
| private ServletContext servletContext; |
| |
| public String execute() throws MalformedURLException, IOException { |
| |
| if (page != null && page.trim().length() > 0) { |
| |
| InputStream in = ClassLoaderUtil.getResourceAsStream(page.substring(page.indexOf("//")+1), getClass()); |
| page = page.replace("//", "/"); |
| |
| if (in == null) { |
| in = servletContext.getResourceAsStream(page); |
| while (in == null && page.indexOf('/', 1) > 0) { |
| page = page.substring(page.indexOf('/', 1)); |
| in = servletContext.getResourceAsStream(page); |
| } |
| } |
| pageLines = read(in, -1); |
| } |
| |
| if (className != null && className.trim().length() > 0) { |
| className = "/"+className.replace('.', '/') + ".java"; |
| InputStream in = getClass().getResourceAsStream(className); |
| if (in == null) { |
| in = servletContext.getResourceAsStream("/WEB-INF/src"+className); |
| } |
| classLines = read(in, -1); |
| } |
| |
| if (config != null && config.trim().length() > 0) { |
| int pos = config.lastIndexOf(':'); |
| configLine = Integer.parseInt(config.substring(pos+1)); |
| config = config.substring(0, pos).replace("//", "/"); |
| configLines = read(new URL(config).openStream(), configLine); |
| } |
| return SUCCESS; |
| } |
| |
| /** |
| * @param className the className to set |
| */ |
| public void setClassName(String className) { |
| this.className = className; |
| } |
| |
| /** |
| * @param config the config to set |
| */ |
| public void setConfig(String config) { |
| this.config = config; |
| } |
| |
| /** |
| * @param page the page to set |
| */ |
| public void setPage(String page) { |
| this.page = page; |
| } |
| |
| /** |
| * @param padding the padding to set |
| */ |
| public void setPadding(int padding) { |
| this.padding = padding; |
| } |
| |
| |
| |
| /** |
| * @return the classLines |
| */ |
| public List getClassLines() { |
| return classLines; |
| } |
| |
| /** |
| * @return the configLines |
| */ |
| public List getConfigLines() { |
| return configLines; |
| } |
| |
| /** |
| * @return the pageLines |
| */ |
| public List getPageLines() { |
| return pageLines; |
| } |
| |
| /** |
| * @return the className |
| */ |
| public String getClassName() { |
| return className; |
| } |
| |
| /** |
| * @return the config |
| */ |
| public String getConfig() { |
| return config; |
| } |
| |
| /** |
| * @return the page |
| */ |
| public String getPage() { |
| return page; |
| } |
| |
| /** |
| * @return the configLine |
| */ |
| public int getConfigLine() { |
| return configLine; |
| } |
| |
| /** |
| * @return the padding |
| */ |
| public int getPadding() { |
| return padding; |
| } |
| |
| /** |
| * Reads in a strea, optionally only including the target line number |
| * and its padding |
| * |
| * @param in The input stream |
| * @param targetLineNumber The target line number, negative to read all |
| * @return A list of lines |
| */ |
| private List read(InputStream in, int targetLineNumber) { |
| List snippet = null; |
| if (in != null) { |
| snippet = new ArrayList(); |
| int startLine = 0; |
| int endLine = Integer.MAX_VALUE; |
| if (targetLineNumber > 0) { |
| startLine = targetLineNumber - padding; |
| endLine = targetLineNumber + padding; |
| } |
| try { |
| BufferedReader reader = new BufferedReader(new InputStreamReader(in)); |
| |
| int lineno = 0; |
| String line; |
| while ((line = reader.readLine()) != null) { |
| lineno++; |
| if (lineno >= startLine && lineno <= endLine) { |
| snippet.add(line); |
| } |
| } |
| } catch (Exception ex) { |
| // ignoring as snippet not available isn't a big deal |
| } |
| } |
| return snippet; |
| } |
| |
| public void setServletContext(ServletContext arg0) { |
| this.servletContext = arg0; |
| } |
| |
| |
| } |