001    /*
002     * Copyright 2007 - 2007 JEuclid, http://jeuclid.sf.net
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    /* $Id: Servlet.java,v 92549dfb4024 2009/09/01 09:06:26 max $ */
018    
019    package net.sourceforge.jeuclid.testsuite;
020    
021    import java.io.IOException;
022    import java.io.InputStream;
023    import java.io.OutputStream;
024    
025    import javax.servlet.ServletException;
026    import javax.servlet.http.HttpServlet;
027    import javax.servlet.http.HttpServletRequest;
028    import javax.servlet.http.HttpServletResponse;
029    import javax.xml.transform.Result;
030    import javax.xml.transform.Source;
031    import javax.xml.transform.stream.StreamResult;
032    import javax.xml.transform.stream.StreamSource;
033    
034    /**
035     * Serve the W3C MathML Testsuite, rendering all formulas with JEuclid to SVG.
036     * 
037     * @version $Revision: 92549dfb4024 $
038     */
039    public class Servlet extends HttpServlet {
040        private static final int BLOCK_SIZE = 4096;
041    
042        private static final TestSuiteProcessor TSP = TestSuiteProcessor
043                .getInstance();
044    
045        /**
046         * 
047         */
048        private static final long serialVersionUID = 1L;
049    
050        /**
051         * Default Constructor.
052         */
053        public Servlet() {
054        }
055    
056        /** {@inheritDoc} */
057        @Override
058        protected void doGet(final HttpServletRequest req,
059                final HttpServletResponse resp) throws ServletException,
060                IOException {
061            final String file = req.getPathInfo();
062            final InputStream stream = Thread.currentThread()
063                    .getContextClassLoader().getResourceAsStream(
064                            "mml2-testsuite/" + file);
065            if (stream == null) {
066                resp.sendError(HttpServletResponse.SC_NOT_FOUND, file);
067            } else {
068                final OutputStream out = resp.getOutputStream();
069    
070                boolean processed = false;
071                if (file.endsWith(".xml")) {
072                    final Source inputSource = new StreamSource(stream);
073                    final Result result = new StreamResult(out);
074                    processed = Servlet.TSP.process(inputSource, result, false);
075                }
076                if (!processed) {
077                    final byte[] buf = new byte[Servlet.BLOCK_SIZE];
078                    int count = stream.read(buf);
079                    while (count > -1) {
080                        out.write(buf, 0, count);
081                        count = stream.read(buf);
082                    }
083                }
084            }
085        }
086    }