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    }