package org.kevoree.library.javase.webserver.wordpress; import com.caucho.quercus.*; import com.caucho.quercus.env.Env; import com.caucho.quercus.env.QuercusValueException; import com.caucho.quercus.env.StringValue; import com.caucho.quercus.lib.*; import com.caucho.quercus.lib.date.DateModule; import com.caucho.quercus.lib.db.MysqlModule; import com.caucho.quercus.lib.db.MysqliModule; import com.caucho.quercus.lib.file.FileModule; import com.caucho.quercus.lib.regexp.RegexpModule; import com.caucho.quercus.lib.string.StringModule; import com.caucho.quercus.page.QuercusPage; import com.caucho.vfs.FilePath; import com.caucho.vfs.Path; import com.caucho.vfs.Vfs; import com.caucho.vfs.WriteStream; import org.kevoree.annotation.ComponentType; import org.kevoree.annotation.DictionaryAttribute; import org.kevoree.annotation.DictionaryType; import org.kevoree.library.javase.webserver.*; import org.kevoree.library.javase.webserver.servlet.LocalServletRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; /** * Created by IntelliJ IDEA. * User: duke * Date: 13/12/11 * Time: 23:05 */ @ComponentType @DictionaryType({ @DictionaryAttribute(name = "mysql_host"), @DictionaryAttribute(name = "mysql_db_name"), @DictionaryAttribute(name = "mysql_login"), @DictionaryAttribute(name = "mysql_pass") }) public class WordPressPage extends AbstractPage { private File rootDir = null; private LocalServletRegistry servletRepository = null;// new LocalServletRegistry(); @Override public void startPage() { servletRepository = new LocalServletRegistry(); super.startPage(); InputStream zipStream = this.getClass().getClassLoader().getResourceAsStream("wordpress-3.3-fr_FR.zip"); if (zipStream != null) { rootDir = new File(ZipHelper.unzipToTempDir(zipStream).getAbsolutePath() + File.separator + "wordpress"); logger.debug("Install base wordpress in " + rootDir.getAbsolutePath()); File outFile = new File(rootDir.getAbsolutePath() + File.separator + "wp-config.php"); TemplateHelper.copyAndReplace(this.getClass().getClassLoader().getResourceAsStream("wp-config.tphp"), outFile, this); servletRepository.registerServlet("php", new PhpWrapperServlet()); } } @Override public KevoreeHttpResponse process(KevoreeHttpRequest request, KevoreeHttpResponse response) { String url = request.getUrl(); if (url.trim().endsWith("/")) { url = url + "index.php"; } if (servletRepository.tryURL(url, request, response)) { return response; } if (FileServiceHelper.checkStaticFileFromDir("index.html", this, request, response, rootDir.getAbsolutePath())) { return response; } response.setContent("Bad request"); return response; } class PhpWrapperServlet extends HttpServlet { // private final L10N L = new L10N(PhpWrapperServlet.class); private final Logger log = LoggerFactory.getLogger(this.getClass()); protected QuercusContext _quercus; protected ServletConfig _config; protected ServletContext _servletContext; /** * initialize the script manager. */ public void init(ServletConfig config) throws ServletException { _config = config; _servletContext = config.getServletContext(); Path pwd = new FilePath(rootDir.getAbsolutePath()); getQuercus().setPwd(pwd); getQuercus().init(); getQuercus().start(); } protected void initImpl(ServletConfig config) throws ServletException { } /** * Sets the profiling mode */ public void setProfileProbability(double probability) { } /** * Service. */ public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Env env = null; WriteStream ws = null; try { QuercusPage page = null; try { String urlpath = getLastParam(request.getRequestURI()); if (urlpath.trim().endsWith("/")) { urlpath = urlpath + "index.php"; } if(urlpath.equals("")){ urlpath = "index.php"; } logger.debug("-->"+urlpath); if (urlpath != null && urlpath != "" && urlpath != "/") { Path path = new FilePath(rootDir.getAbsolutePath() + File.separator + urlpath); page = getQuercus().parse(path); } else { Path path = new FilePath(rootDir.getAbsolutePath() + File.separator + "index.php"); page = getQuercus().parse(path); } } catch (FileNotFoundException ex) { // php/2001 log.debug("File not found ", ex); response.sendError(HttpServletResponse.SC_NOT_FOUND); return; } ws = openWrite(response); // php/6006 ws.setNewlineString("\n"); QuercusContext quercus = getQuercus(); env = quercus.createEnv(page, ws, request, response); quercus.setServletContext(_servletContext); try { env.start(); // php/2030, php/2032, php/2033 // Jetty hides server classes from web-app // http://docs.codehaus.org/display/JETTY/Classloading // env.setGlobalValue("request", env.wrapJava(request)); // env.setGlobalValue("response", env.wrapJava(response)); // env.setGlobalValue("servletContext", env.wrapJava(_servletContext)); StringValue prepend = quercus.getIniValue("auto_prepend_file").toStringValue(env); if (prepend.length() > 0) { Path prependPath = env.lookup(prepend); if (prependPath == null) env.error("auto_prepend_file '{0}' not found." + prepend); else { QuercusPage prependPage = getQuercus().parse(prependPath); prependPage.executeTop(env); } } env.executeTop(); StringValue append = quercus.getIniValue("auto_append_file").toStringValue(env); if (append.length() > 0) { Path appendPath = env.lookup(append); if (appendPath == null) env.error("auto_append_file '{0}' not found." + append); else { QuercusPage appendPage = getQuercus().parse(appendPath); appendPage.executeTop(env); } } // return; } catch (QuercusExitException e) { throw e; } catch (QuercusErrorException e) { throw e; } catch (QuercusLineRuntimeException e) { logger.debug("", e); ws.println(e.getMessage()); // return; } catch (QuercusValueException e) { logger.debug("", e); ws.println(e.toString()); // return; } catch (Throwable e) { if (response.isCommitted()) e.printStackTrace(ws.getPrintWriter()); ws = null; throw e; } finally { if (env != null) env.close(); if (ws != null && env.getDuplex() == null) ws.close(); } } catch (QuercusDieException e) { // normal exit //logger.debug("", e); } catch (QuercusExitException e) { // normal exit //logger.debug("", e); } catch (QuercusErrorException e) { // error exit logger.debug("Php interpreter error ", e); } catch (RuntimeException e) { throw e; } catch (Throwable e) { throw new ServletException(e); } } protected WriteStream openWrite(HttpServletResponse response) throws IOException { WriteStream ws; OutputStream out = response.getOutputStream(); ws = Vfs.openWrite(out); return ws; } protected QuercusContext getQuercus() { synchronized (this) { if (_quercus == null) _quercus = new QuercusContext(); _quercus.addModule(new DateModule()); _quercus.addModule(new StringModule()); _quercus.addModule(new FileModule()); _quercus.addModule(new VariableModule()); _quercus.addModule(new MiscModule()); _quercus.addModule(new NetworkModule()); _quercus.addModule(new OptionsModule()); _quercus.addModule(new OutputModule()); _quercus.addModule(new TokenModule()); _quercus.addModule(new UrlModule()); _quercus.addModule(new ExifModule()); _quercus.addModule(new FunctionModule()); _quercus.addModule(new HashModule()); _quercus.addModule(new HtmlModule()); _quercus.addModule(new HttpModule()); _quercus.addModule(new ImageModule()); _quercus.addModule(new JavaModule()); _quercus.addModule(new MathModule()); _quercus.addModule(new MhashModule()); _quercus.addModule(new ApacheModule()); _quercus.addModule(new ApcModule()); _quercus.addModule(new ArrayModule()); _quercus.addModule(new BcmathModule()); _quercus.addModule(new ClassesModule()); _quercus.addModule(new CtypeModule()); _quercus.addModule(new ErrorModule()); _quercus.addModule(new RegexpModule()); _quercus.addModule(new MysqlModule()); _quercus.addModule(new MysqliModule()); } return _quercus; } /** * Destroys the quercus instance. */ public void destroy() { _quercus.close(); } } }