blob: 11706ce1d98b877ef9c11b3fa63d244d4727ab46 [file] [log] [blame]
/*
* 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.commons.jci2.examples.serverpages;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import org.apache.commons.jci2.utils.ConversionUtils;
/**
* @author tcurdt
*/
public final class JspGenerator {
private String quote( final String s ) {
final StringBuilder sb = new StringBuilder();
final char[] input = s.toCharArray();
for (final char c : input) {
if (c == '"') {
sb.append('\\');
}
if (c == '\\') {
sb.append('\\');
}
if (c == '\n') {
sb.append("\");\n").append(" out.write(\"");
continue;
}
sb.append(c);
}
return sb.toString();
}
private void wrap( final StringBuilder pInput, final Writer pOutput ) throws IOException {
pOutput.append(" out.write(\"");
pOutput.append(quote(pInput.toString()));
pOutput.append("\");").append('\n');
}
public byte[] generateJavaSource( final String pResourceName, final File pFile ) {
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final Writer output = new OutputStreamWriter(outputStream);
try {
final Reader input = new InputStreamReader(new FileInputStream(pFile));
final int p = pResourceName.lastIndexOf('/');
final String className;
final String packageName;
if (p < 0) {
className = ConversionUtils.stripExtension(pResourceName);
packageName = "";
} else {
className = ConversionUtils.stripExtension(pResourceName.substring(p+1));
packageName = pResourceName.substring(0, p).replace('/', '.');
output.append("package ").append(packageName).append(";").append('\n');
}
output.append("import java.io.PrintWriter;").append('\n');
output.append("import java.io.IOException;").append('\n');
output.append("import javax.servlet.http.HttpServlet;").append('\n');
output.append("import javax.servlet.http.HttpServletRequest;").append('\n');
output.append("import javax.servlet.http.HttpServletResponse;").append('\n');
output.append("import javax.servlet.ServletException;").append('\n');
output.append("public class ").append(className).append(" extends HttpServlet {").append('\n');
output.append(" protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {").append('\n');
output.append(" final PrintWriter out = response.getWriter();").append('\n');
final char[] open = "<?".toCharArray();
final char[] close = "?>".toCharArray();
StringBuilder sb = new StringBuilder();
char[] watch = open;
int w = 0;
while(true) {
final int c = input.read();
if (c < 0) {
break;
}
if (c == watch[w]) {
w++;
if (watch.length == w) {
if (watch == open) {
// found open
wrap(sb, output);
sb = new StringBuilder();
watch = close;
} else if (watch == close) {
// found close
// <? ... ?> is java
output.append(sb.toString());
sb = new StringBuilder();
watch = open;
}
w = 0;
}
} else {
if (w > 0) {
sb.append(watch, 0, w);
}
sb.append((char)c);
w = 0;
}
}
if (watch == open) {
wrap(sb, output);
}
output.append(" out.close();").append('\n');
output.append(" out.flush();").append('\n');
output.append(" }").append('\n');
output.append("}").append('\n');
return outputStream.toByteArray();
} catch (final IOException e) {
return null;
} finally {
try {
output.close();
} catch (final IOException e) {
}
}
}
}