/* * $Id: ViewSourceAction.java 570518 2007-08-28 18:26:48Z jholmes $ * * 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 javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
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) {
int indexOf = page.indexOf(
"//"); InputStream in = ClassLoaderUtil.getResourceAsStream(page.substring(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 (in != null) { in.close(); } } 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 (in != null) { in.close(); } } String rootPath = ServletActionContext.getServletContext().getRealPath("/"); if (config != null && config.trim().length() > 0 && (rootPath == null || config.startsWith(rootPath))) { 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; } }