001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.commons.jci.examples.serverpages; 019 020 import java.io.ByteArrayOutputStream; 021 import java.io.File; 022 import java.io.FileInputStream; 023 import java.io.IOException; 024 import java.io.InputStreamReader; 025 import java.io.OutputStreamWriter; 026 import java.io.Reader; 027 import java.io.Writer; 028 029 import org.apache.commons.jci.utils.ConversionUtils; 030 031 /** 032 * @author tcurdt 033 */ 034 public final class JspGenerator { 035 036 private String quote( final String s ) { 037 038 final StringBuilder sb = new StringBuilder(); 039 final char[] input = s.toCharArray(); 040 041 for (char c : input) { 042 if (c == '"') { 043 sb.append('\\'); 044 } 045 if (c == '\\') { 046 sb.append('\\'); 047 } 048 049 if (c == '\n') { 050 sb.append("\");\n").append(" out.write(\""); 051 continue; 052 } 053 sb.append(c); 054 } 055 056 return sb.toString(); 057 } 058 059 private void wrap( final StringBuilder pInput, final Writer pOutput ) throws IOException { 060 061 pOutput.append(" out.write(\""); 062 063 pOutput.append(quote(pInput.toString())); 064 065 pOutput.append("\");").append('\n'); 066 } 067 068 public byte[] generateJavaSource( final String pResourceName, final File pFile ) { 069 070 final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 071 final Writer output = new OutputStreamWriter(outputStream); 072 073 try { 074 final Reader input = new InputStreamReader(new FileInputStream(pFile)); 075 076 final int p = pResourceName.lastIndexOf('/'); 077 078 final String className; 079 final String packageName; 080 081 if (p < 0) { 082 className = ConversionUtils.stripExtension(pResourceName); 083 packageName = ""; 084 } else { 085 className = ConversionUtils.stripExtension(pResourceName.substring(p+1)); 086 packageName = pResourceName.substring(0, p).replace('/', '.'); 087 output.append("package ").append(packageName).append(";").append('\n'); 088 } 089 090 091 output.append("import java.io.PrintWriter;").append('\n'); 092 output.append("import java.io.IOException;").append('\n'); 093 output.append("import javax.servlet.http.HttpServlet;").append('\n'); 094 output.append("import javax.servlet.http.HttpServletRequest;").append('\n'); 095 output.append("import javax.servlet.http.HttpServletResponse;").append('\n'); 096 output.append("import javax.servlet.ServletException;").append('\n'); 097 output.append("public class ").append(className).append(" extends HttpServlet {").append('\n'); 098 output.append(" protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {").append('\n'); 099 output.append(" final PrintWriter out = response.getWriter();").append('\n'); 100 101 102 final char[] open = "<?".toCharArray(); 103 final char[] close = "?>".toCharArray(); 104 105 StringBuilder sb = new StringBuilder(); 106 char[] watch = open; 107 int w = 0; 108 while(true) { 109 int c = input.read(); 110 111 if (c < 0) { 112 break; 113 } 114 115 if (c == watch[w]) { 116 w++; 117 if (watch.length == w) { 118 if (watch == open) { 119 // found open 120 121 wrap(sb, output); 122 123 sb = new StringBuilder(); 124 watch = close; 125 } else if (watch == close) { 126 // found close 127 128 // <? ... ?> is java 129 output.append(sb.toString()); 130 131 sb = new StringBuilder(); 132 watch = open; 133 } 134 w = 0; 135 } 136 } else { 137 if (w > 0) { 138 sb.append(watch, 0, w); 139 } 140 141 sb.append((char)c); 142 143 w = 0; 144 } 145 } 146 147 if (watch == open) { 148 wrap(sb, output); 149 } 150 151 152 output.append(" out.close();").append('\n'); 153 output.append(" out.flush();").append('\n'); 154 output.append(" }").append('\n'); 155 output.append("}").append('\n'); 156 157 return outputStream.toByteArray(); 158 159 } catch (IOException e) { 160 return null; 161 } finally { 162 try { 163 output.close(); 164 } catch (IOException e) { 165 } 166 } 167 } 168 169 }